web-dev-qa-db-fra.com

L'exception n'est jamais lancée dans le corps de l'instruction try correspondante

J'ai un problème avec la gestion des exceptions en Java, voici mon code. J'ai une erreur de compilation lorsque j'essaie de lancer cette ligne: throw new MojException("Bledne dane");. L'erreur est:

exception MojException n'est jamais levée dans le corps de l'instruction try correspondante

Voici le code:

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());
      }
    }
  }
}

Et voici un code de MojException:

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

Est-ce que quelqu'un peut m'aider avec ça?

11
user3407967

Un bloc catch dans une instruction try doit capturer exactement l'exception que le code à l'intérieur du try {}- block can throw (ou une super classe de celle-ci).

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

Ce que vous essayez de faire est la suivante:

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

Cela entraînera une erreur du compilateur, car votre Java sait que vous essayez de capturer une exception qui ne se produira JAMAIS. Ainsi, vous obtiendrez: exception ExceptionA is never thrown in body of corresponding try statement.

15
Christian

Comme indiqué dans les commentaires, vous ne pouvez pas intercepter une exception non générée par le code de votre bloc try. Essayez de changer votre code pour:

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

Vérifiez toujours la documentation pour voir quelles exceptions sont levées par chaque méthode. Vous voudrez peut-être aussi lire sur le sujet checked vs non checked exceptions avant que cela ne vous cause une confusion dans le futur.

6
Duncan Jones

Rappelez-vous toujours qu'en cas d'exception cochée, vous ne pouvez intercepter qu'après avoir levé l'exception (vous pouvez utiliser l'une des méthodes incorporées utilisées dans votre code), mais en cas d'exception non contrôlée, vous êtes pris, même si vous n'avez pas levé d'exception.

0
Mohit gupta

Toute classe qui étend la classe Exception sera une classe d'exception cochée définie par l'utilisateur où, comme toute classe qui étend RuntimeException, sera classe d'exception non contrôlée. Comme mentionné dans Exception définie par l'utilisateur sont des exceptions cochées ou non cochées Ainsi, le fait de ne pas lever l'exception cochée (qu'il s'agisse d'une exception définie par l'utilisateur ou d'une exception intégrée) donne une erreur lors de la compilation.

Exception cochée sont les exceptions vérifiées lors de la compilation.

Exception non contrôlée sont les exceptions qui ne sont pas vérifiées au moment de la compilation.

0
Astha