[RESOLVIDO] Java Exceptions

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?

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é+

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:

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

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?

1 curtida