java - 在“内部”方法中抛出异常后如何停止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()
没有达到。
我究竟做错了什么?
解决方案
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;
}
}
推荐阅读
- git-lfs - 樱桃挑选是否使用 lfs 创建新文件
- c++ - 计算负基的正非整数幂
- asp.net-core - 如何在类中注入强类型 signalR 集线器 [ASP CORE 2.2]
- c# - Task.WaitAll() 丢失结果不等到实际完成
- python - 如何根据 timedelta 计算特定值的出现
- vim - Vim 缩进配置
- flutter - flutter + firebase无密码电子邮件登录-动态链接数据返回null
- validation - Apps 脚本中用于数据验证的控制消息框
- javascript - Vue路由器-如何根据用户角色在同一路由路径上加载多个组件?
- python - 尝试计算和打印整数时获取“int”对象不是可下标的错误