1
votes

Comment arrêter l'exécution de la méthode Java après avoir lancé une exception à l'intérieur de la méthode 'interne'?

J'ai écrit un exemple illustrant mon problème. J'ai une simple exception:

    speakToPerson2 caused exception
    exceptions.TryToSpeakException: Person 1 don't wanna speak to anyone.
    at exceptions.TryToSpeak.speakToPerson1(TryToSpeak.java:7)
    at exceptions.TryToSpeak.speakToPerson2(TryToSpeak.java:12)
    at exceptions.TryToSpeak.main(TryToSpeak.java:26)

Ensuite, j'ai une chaîne de méthodes qui s'invoquent une par une:

public static void speakToPerson1() {
    throw new TryToSpeakException("Person 1 don't wanna speak to anyone.");
}

public static void speakToPerson2() {
    try {
        speakToPerson1();

        keepSilentToPerson();
    } catch (Exception e) {
        System.out.println("speakToPerson2 caused exception");
        e.printStackTrace();
    }
}

static void keepSilentToPerson() {
    System.out.println("Keeping silent to person 1");
}

public static void main(String[] args) {
    speakToPerson2();
}

La méthode de le tout «bas» jette une exception. Dans la méthode communiquez () après l'invocation de la méthode speakToPerson3 () , l'exécution se poursuit. Ce dont j'ai besoin - c'est d'arrêter l'exécution, pour que l'invocation de la méthode keepSilentToPerson () ne soit jamais atteinte et me donne le message "Exception de communication." .

Voici ce que j'obtiens dans la console maintenant:

speakToPerson2 caused exception
exceptions.TryToSpeakException: Person 1 don't wanna speak to anyone.
    at exceptions.TryToSpeak.speakToPerson1(TryToSpeak.java:7)
    at exceptions.TryToSpeak.speakToPerson2(TryToSpeak.java:12)
    at exceptions.TryToSpeak.speakToPerson3(TryToSpeak.java:22)
    at exceptions.TryToSpeak.communicate(TryToSpeak.java:36)
    at exceptions.TryToSpeak.main(TryToSpeak.java:46)
Keeping silent to person 1

Mais si j'appelle speakToPerson2 () depuis ma méthode principale comme ceci: p >

public class TryToSpeak {

    public static void speakToPerson1() {
        throw new TryToSpeakException("Person 1 don't wanna speak to anyone.");
    }

    public static void speakToPerson2() {
        try {
            speakToPerson1();
        } catch (Exception e) {
            System.out.println("speakToPerson2 caused exception");
            e.printStackTrace();
        }
    }

    public static void speakToPerson3() {
        try {
            speakToPerson2();

        } catch (Exception e) {
            System.out.println("speakToPerson3 caused exception");
            e.printStackTrace();
        }
    }

    static void keepSilentToPerson() {
        System.out.println("Keeping silent to person 1");
    }

    public static void communicate() {
        try {
            speakToPerson3();

            keepSilentToPerson(); // Why it reaches this part?
        } catch (Exception e) {
            System.out.println("Communication exception.");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        communicate();
    }
}

J'obtiens un résultat évident:

public class TryToSpeakException extends RuntimeException {

    public TryToSpeakException(String message) {
        super(message);
    }
}

keepSilentToPerson () n'est pas atteint. p >

Qu'est-ce que je fais mal?


1 commentaires

speakToPerson3 attrape toutes les exceptions, alors il est évident que votre méthode de communication fonctionnera sans aucune erreur


4 Réponses :


0
votes

Vous pouvez lancer l'exception après avoir détecté les méthodes speakTo * . Cela arrêtera l'exécution du code dans les méthodes appelant speakTo * et leur bloc catch sera exécuté.

       catch (Exception e) {
            System.out.println("speakToPerson2 caused exception");
            e.printStackTrace();
            throw e;
        }


0 commentaires

2
votes

speakToPerson2 () attrape l'exception, mais vous voulez que communique () l'attrape aussi. Essentiellement, speakToPerson2 () supprime l'exception, donc aucune autre méthode ne la voit.

Ce que vous devez faire est de la relancer (à la fois dans speakToPerson2 () et speakToPerson3 () ). C'est ce qu'on appelle propager une exception.

C'est-à-dire:

public static void speakToPerson2() {
    try {
      speakToPerson1();
    } catch (Exception e) {
      System.out.println("speakToPerson2 caused exception");
      e.printStackTrace();
      throw e;
    }
  }

  public static void speakToPerson3() {
    try {
      speakToPerson2();

    } catch (Exception e) {
      System.out.println("speakToPerson3 caused exception");
      e.printStackTrace();
      throw e;
    }
  }


1 commentaires

Merci les gars, c'est exactement ce dont j'ai besoin! Je vais jouer avec.



2
votes

Vous devez comprendre exactement comment fonctionne try-catch . Si une méthode de try-catch lève une exception (une qui étend / ou est Exception dans votre exemple), le corps du try-catch sera interrompu pour entrer dans la clause catch .

Dans votre cas, la méthode speakToPerson1 lancera une TryToSpeakException . Cette exception sera transmise une étape ci-dessus dans la pile d'appels de méthode, la méthode speakToPerson2 dans votre cas. Puisque l'appel à speakToPerson1 est entouré d'un try-catch , la clause catch est invoquée et System.out.println (" speakToPerson2 a provoqué une exception "); est exécuté. Maintenant, la clause try englobe deux appels de méthodes, à savoir speakToPerson1 et keepSilentToPerson . Cependant, comme la première méthode lève l'exception, la seconde n'est jamais atteinte et donc keepSilentToPerson () ne sera jamais appelée.

Enfin, pensez à la capture des exceptions. Si vous rencontrez une exception, vous dites que vous allez la gérer, en la récupérant ou en la renvoyant. Si vous le gérez sans le relancer, il ne sera pas transféré au niveau supérieur de votre pile d'appels. Attention à cette technicité


0 commentaires

0
votes

Vous devez propager vos exceptions à la classe principale pour arrêter complètement l'exécution d'un programme.

Dans le cas 1: toutes vos exceptions seront gérées par la fonction speakToPerson2 .

Dans le cas 2: votre exception se produit lors de l'appel de fonction de speakToPerson1 , donc le reste de votre code ne s'exécutera pas.

Donc, pour arrêter le programme de s'exécuter, il vous suffit de propager l'exception, en utilisant le mot-clé throw , dans le bloc catch de votre exception.


0 commentaires