[RESOLVIDO] Java Exceptions

4 respostas
javaexception
J

Olá,

AInda sou iniciante em Java e tenho dúvidas quanto às Exceptions :

Sei que podemos fazer uma verificação do tipo if para pegarmos alguma Exceção durante um looping, por exemplo. Digamos que tenho uma String ‘arg’ :

try{
... //códigos aqui
  if (arg.lenght() > 100) {
         throw new Exception("O argumento passado é muito grande !");
                          }
... //códigos aqui
   } catch(Exception e) {
         System.out.println(e.getMessage());
                      }

O que eu quero saber é : nesse modo, o programa gera um objeto anônimo do tipo Exception, certo?!

Mas o meu intuito não é encher o try-catch de if-else… Eu queria saber como criar Exceptions “dedicadas” a certa situação, por exemplo, uma Exception “TooLongException” que pegue Strings maiores que certo tamanho, etc.

É possível? É necessário?

4 Respostas

A

Eu também. :joy:

Creio que este seja seu principal objetivo, pois promove economia de codificação e reduz a complexidade ciclomática/condicional (utilização de if), podendo fornecer informações personalizadas sobre um evento, com o intuito de facilitar o debug.

Neste ponto, eu, em particular, não consigo ajudar, mas sim, é possível.

O que eu recomendaria na verdade, é tentar aproveitar as exceções existentes no Java.

Por exemplo, esta exceção que você “quer” criar pode ser capturada pelo IllegalArgumentException, mais ai é questão de finalidade e até mesmo gosto a depender da situação.

Para ter uma noção eu preferiria implementar uma classe abstrata que tivesse a responsabilidade de organizar estas exceções:

Veja este exemplo:
Classe de teste:

public class Teste{

    @SuppressWarnings("CallToPrintStackTrace")
    public static void main(String[] args) {

        try {
            ExcecaoPersonalizada.IntervaloIlegal(1, 3, 6);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }

        try {
            ExcecaoPersonalizada.IntervaloIlegal("Com mensagem auxiliar", 8, 2, 7);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
        
        String emTeste = "Media de acerto";
        try {
            ExcecaoPersonalizada.IntervaloIlegal("O tamanho da String -> "+emTeste.length()+" é maior que o permitido: 5 ", emTeste.length() > 5);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }
}

Classe para gerenciamento de exceções

public abstract class ExcecaoPersonalizada {

    /**
     * Utiliza um intervalo numérico para validar um argumento numérico
     * @param mensagem visa esclarecer possíveis motivos do erro
     * @param excecaoPrevista se um teste for verdadeiro lança uma exceção
     * @throws IllegalArgumentException quando a variável em análise estiver
     * fora do intervalo de análise aceitável
     */
    public static final void IntervaloIlegal(String mensagem, boolean excecaoPrevista) throws IllegalArgumentException{
        if (excecaoPrevista) {
            throw new IllegalArgumentException(mensagem);
        }
    }
    
    /**
     * Utiliza um intervalo numérico para validar um argumento numérico
     * @param variavel a ser validada dentro de um intervalo
     * @param inicio do intervalo
     * @param fim do intervalo
     * @throws IllegalArgumentException quando a variável em análise estiver
     * fora do intervalo
     */
    public static final void IntervaloIlegal(double variavel, double inicio, double fim) throws IllegalArgumentException{
        IntervaloIlegal("", variavel, inicio, fim);
    }

    /**
     * Utiliza intervalos numérico para validar um argumento numérico
     * @param mensagem informação utilizada para ajudar a resolver um problema
     * @param variavel a ser validada dentro de um intervalo
     * @param inicio do intervalo
     * @param fim do intervalo
     * @throws IllegalArgumentException quando a variável em análise estiver
     * fora do intervalo
     */
    public static final void IntervaloIlegal(String mensagem, double variavel, double inicio, double fim) throws IllegalArgumentException{
        IntervaloIlegal(mensagem + "\nO valor da variável -> [" + variavel + "] esta fora do intervalo disponibilizado [" + inicio + " , " + fim + "]", variavel < inicio || variavel > fim);
    }

}

Ao meu ver, a documentação deve ser um dos fatores de esclarecimento sobre a utilização desta técnica, não convencional.

No momento é a melhor contribuição que posso ofertar.
Té+

J

Muito boa a sugestão :slight_smile:

Pelo menos o try-catch “principal” não fica cheio de if-else (que vão ficar “escondidos” nos métodos)… Obrigado ! :slight_smile:

J

Eu tentei de um jeito parecido, que pode ter ficado meio “estranho”, mas funcionou,

Criei a classe TooLongException, que estende RuntimeException :

public class TooLongException extends RuntimeException {

private static final long serialVersionUID = 1L;

public TooLongException(String parse) {

	super("String muito grande !");
	this.verificarTamanho(parse);

}

private void verificarTamanho(String parse) {

	if (parse.length() > 50) {

		throw this;
	}
}

Na classe de execução :

public class Exec {

public static void main(String[] args) {

	String x = "jfhjfhdjdhfjdfhdfjdhfjdhdjhfjbfdhndsbhdbkjdsnsdjsdnjdsnjdfdfjhf";
	new TooLongException(x);

}

}

Resultado :

Exception in thread "main" abc.java.TooLongException: String muito grande !
at abc.java.Exec.main(Exec.java:8)

Funcionou ! Rsrs

R

As sugestões são válidas, mas apenas para reflexão:

Será que toda exceção lançada, precisa mesmo ser tradada?

Será que tanto if/else (dentro ou fora do try/catch) são realmente necessários? (lembre-se, não se pode prever tudo)

As vezes a gente se acostuma tanto a tratar exceções, que acabamos transformando isso em regra, lembre-se são exceções! :joy:, ou seja um caso ou outro em específico (principalmente as checked exceptions)…

Será que buscando implementar usando polimorfismo não resolveria o problema das exceções assim como hoje resolve o uso excessivo de if’s?

É bom programar sempre imaginando que outra pessoa vai usar seu código, logo, será que preciso entregar minha parte totalmente protegida de exceções?

Criado 10 de agosto de 2017
Ultima resposta 15 de ago. de 2017
Respostas 4
Participantes 3