A exceção nunca é lançada no corpo da instrução try correspondente

Eu tenho um problema com o tratamento de exceções em Java, aqui está o meu código. Eu tenho erro de compilador quando tento executar esta linha: throw new MojException("Bledne dane"); . O erro é:

exceção MojException nunca é lançada no corpo da instrução try correspondente

Aqui está o código:

 public class Test { public static void main(String[] args) throws MojException { // TODO Auto-generated method stub for(int i=1;i<args.length;i++){ try{ Integer.parseInt(args[i-1]); } catch(MojException e){ throw new MojException("Bledne dane"); } try{ WierszTrojkataPascala a = new WierszTrojkataPascala(Integer.parseInt(args[0])); System.out.println(args[i]+" : "+a.wspolczynnik(Integer.parseInt(args[i]))); } catch(MojException e){ throw new MojException(args[i]+" "+e.getMessage()); } } } } 

E aqui está um código do MojException:

 public class MojException extends Exception{ MojException(String s){ super(s); } } 

Alguém pode me ajudar com isso?

Um catch-block em uma instrução try precisa capturar exatamente a exceção que o código dentro do try {} -block pode lançar (ou uma superclass disso).

 try { //do something that throws ExceptionA, eg throw new ExceptionA("I am Exception Alpha!"); } catch(ExceptionA e) { //do something to handle the exception, eg System.out.println("Message: " + e.getMessage()); } 

O que você está tentando fazer é isto:

 try { throw new ExceptionB("I am Exception Bravo!"); } catch(ExceptionA e) { System.out.println("Message: " + e.getMessage()); } 

Isso levará a um erro do compilador, porque seu java sabe que você está tentando capturar uma exceção que nunca irá ocorrer. Assim você obteria: exception ExceptionA is never thrown in body of corresponding try statement .

Como apontado nos comentários, você não pode capturar uma exceção que não seja lançada pelo código dentro do seu bloco try . Tente alterar seu código para:

 try{ Integer.parseInt(args[i-1]); // this only throws a NumberFormatException } catch(NumberFormatException e){ throw new MojException("Bledne dane"); } 

Sempre verifique a documentação para ver quais exceções são lançadas por cada método. Você também pode querer ler sobre o assunto de exceções verificadas vs desmarcadas antes que isso cause qualquer confusão no futuro.

Lembre-se sempre que no caso de exceção verificada você pode pegar somente depois de lançar a exceção (ou você joga ou qualquer método inerente usado em seu código pode lançar), mas em caso de exceção desmarcada Você é pega mesmo quando você não jogou essa exceção.

Qualquer class que estender a class Exception será uma class de exceção Checked definida pelo usuário, na qual qualquer class que estender RuntimeException será a class de exceção Unchecked . como mencionado em Exceção definida pelo usuário, exceções marcadas ou desmarcadas Portanto, não lançar a exceção verificada (seja exceção interna ou definida pelo usuário) gera um erro de tempo de compilation.

Exceção verificada são as exceções verificadas em tempo de compilation.

Exceções não verificadas são as exceções que não são verificadas no tempo de compilation