Java 如何在';内部';方法
我写了一个例子来描述我的问题。 我有一个简单的例外:Java 如何在';内部';方法,java,exception,Java,Exception,我写了一个例子来描述我的问题。 我有一个简单的例外: 公共类TryToSpeakeException扩展RuntimeException{ 公共TryToSpeakException(字符串消息){ 超级(信息); } } 然后我有一系列方法,它们一个接一个地相互调用: 公共类TryToSpeak{ 公共静态void speakToPerson1(){ 抛出新的TryToSpeakException(“人1不想和任何人说话”); } 公共静态void speakToPerson2(){ 试一试
公共类TryToSpeakeException扩展RuntimeException{
公共TryToSpeakException(字符串消息){
超级(信息);
}
}
然后我有一系列方法,它们一个接一个地相互调用:
公共类TryToSpeak{
公共静态void speakToPerson1(){
抛出新的TryToSpeakException(“人1不想和任何人说话”);
}
公共静态void speakToPerson2(){
试一试{
speakToPerson1();
}捕获(例外e){
System.out.println(“speakToPerson2导致异常”);
e、 printStackTrace();
}
}
公共静态void speakToPerson3(){
试一试{
speakToPerson2();
}捕获(例外e){
System.out.println(“speakToPerson3导致异常”);
e、 printStackTrace();
}
}
静态void keepSilentToPerson(){
System.out.println(“对人1保持沉默”);
}
公共静态无效通信(){
试一试{
speakToPerson3();
keepSilentToPerson();//为什么它会到达这一部分?
}捕获(例外e){
System.out.println(“通信异常”);
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
沟通();
}
}
从“底部”开始的方法引发异常。在方法communicate()
中,调用方法speakToPerson3()
后,执行继续进行。
我需要的是停止执行,这样就永远不会调用方法keepSilentToPerson()
,并向我发送消息“通信异常”。
这是我现在在控制台中得到的:
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()
,如下所示:
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()
我做错了什么?捕获异常后可以抛出异常
speakTo*
方法。这将停止调用speakTo*
的方法中的代码执行,并执行它们的catch块
catch(异常e){
System.out.println(“speakToPerson2导致异常”);
e、 printStackTrace();
投掷e;
}
您可以在捕获异常后抛出异常speakTo*
方法。这将停止调用speakTo*
的方法中的代码执行,并执行它们的catch块
catch(异常e){
System.out.println(“speakToPerson2导致异常”);
e、 printStackTrace();
投掷e;
}
speakToPerson2()
正在捕获异常,但您希望communicate()
也捕获异常。本质上,speakToPerson2()
正在抑制异常,因此没有其他方法看到它
您需要做的是重新播放它(在speakToPerson2()
和speakToPerson3()
中)。这称为传播异常
即:
speakToPerson2()
正在捕获异常,但您希望communicate()
也捕获异常。本质上,speakToPerson2()
正在抑制异常,因此没有其他方法看到它
您需要做的是重新播放它(在speakToPerson2()
和speakToPerson3()
中)。这称为传播异常
即:
您需要准确了解
try catch
的工作原理。如果try-catch中的任何方法抛出异常(在您的示例中是扩展/或异常的方法),try-catch的主体将被中断以进入catch
子句
在您的情况下,方法speakToPerson1
将抛出TryToSpeakException
。此异常将在方法调用堆栈中转发一步,即您的案例中的方法speakToPerson2
。由于对speakToPerson1
的调用被try-catch
包围,因此将调用catch
子句并调用System.out.println(“speakToPerson2引起的异常”)代码>被执行。现在,try
子句包含两个方法调用,即speakToPerson1
和keepSilentToPerson
。但是,由于第一个方法抛出异常,因此永远不会到达第二个方法,因此永远不会调用keepSilentToPerson()
最后,考虑捕获异常。如果您捕获到一个异常,您是说您将通过恢复或重新触发它来处理它。如果您处理它而不重新调用它,它将不会被转发到调用堆栈的上层。要注意这一技术性您需要准确了解try catch
的工作原理。如果try-catch中的任何方法抛出异常(在您的示例中是扩展/或异常的方法),try-catch的主体将被中断以进入catch
子句
在您的情况下,方法speakToPerson1
将抛出TryToSpeakException
。此异常将在方法调用堆栈中转发一步,即您的案例中的方法speakToPerson2
。由于对speakToPerson1
的调用被try-catch
包围,因此将调用catch
子句并调用System.out.println(“speakToPerson2引起的异常”)代码>被执行。现在,try
子句包含两个方法调用,即speakToPerson1
和keepSilentToPerson
。但是,由于第一个方法抛出异常,因此永远不会到达第二个方法,因此永远不会调用keepSilentToPerson()
最后,考虑捕获异常。如果你抓住了一个例外
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;
}
}