gpt4 book ai didi

java - 在 'inner' 方法中抛出异常后如何停止 java 方法的执行?

转载 作者:行者123 更新时间:2023-11-29 08:20:34 26 4
gpt4 key购买 nike

我写了一个例子来描述我的问题。我有一个简单的异常(exception):

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

最“底层”的方法抛出异常。在调用方法 speakToPerson3() 之后,方法 communicate() 继续执行。我需要的是停止执行,这样永远不会调用方法 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

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

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() 未达到。

我做错了什么?

最佳答案

speakToPerson2() 正在捕获异常,但您希望 communicate() 也捕获它。本质上,speakToPerson2() 正在抑制异常,因此没有其他方法可以看到它。

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

即:

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

关于java - 在 'inner' 方法中抛出异常后如何停止 java 方法的执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59084547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com