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