首页 > 解决方案 > 在“内部”方法中抛出异常后如何停止Java方法执行?

问题描述

我写了一个例子来描述我的问题。我有一个简单的例外:

public class TryToSpeakException extends RuntimeException {

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

然后我有一个方法链,它们一个一个地相互调用:

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

来自“最底层”的方法会引发异常。communicate()在调用方法之后的方法speakToPerson3()中,执行继续进行。我需要的是停止执行,以便keepSilentToPerson()永远不会调用方法并给我消息"Communication 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.speakToPerson3(TryToSpeak.java:22)
    at exceptions.TryToSpeak.communicate(TryToSpeak.java:36)
    at exceptions.TryToSpeak.main(TryToSpeak.java:46)
Keeping silent to person 1

但是,如果我speakToPerson2()像这样从我的 Main 方法调用:

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

我得到一个明显的结果:

    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)

keepSilentToPerson()没有达到。

我究竟做错了什么?

标签: javaexception

解决方案


speakToPerson2()正在捕获异常,但您也想communicate()捕获它。本质上,speakToPerson2()是抑制异常,所以没有其他方法看到它。

您需要做的是重新抛出它(在两者中speakToPerson2()speakToPerson3()。这称为传播异常。

IE:

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

推荐阅读