Java 在catch子句中再次引用异常后会发生什么?
我在API和其他相关问题中看到了这一点:Java 在catch子句中再次引用异常后会发生什么?,java,exception,exception-handling,Java,Exception,Exception Handling,我在API和其他相关问题中看到了这一点: try { } catch (IOException e) { throw new SampleException("Other IOException", e); } 这将调用一个新的异常 但现在我看到了这个例子,它称自己为。我正试图编写文档,它似乎又在调用它自己 try { statements; }catch(TheException e) { //perform operations before exits;
try {
} catch (IOException e) {
throw new SampleException("Other IOException", e);
}
这将调用一个新的异常
但现在我看到了这个例子,它称自己为。我正试图编写文档,它似乎又在调用它自己
try {
statements;
}catch(TheException e) {
//perform operations before exits;
throw e;
}
重新引发异常,以便其他处理程序有机会
处理异常
我想我们不能在捕获异常后再添加一个异常!那么在这种情况下,谁是另一个处理者?我测试了它,我意识到即使catch子句之后的代码也没有编译 尝试修改JAVA中异常的工作方式,尤其是
throw/throws
关键字以及它们的区别
这是一个很好的解释
您可以随时参考以了解更多信息
关于您的问题,您的代码可能没有编译,因为
抛出的方法可能没有抛出异常。您可以在方法头中添加抛出异常
,使其生效,或者您可以尝试将try/catch
包含在另一个处理(捕获)的try/catch
中TheException
尝试修改JAVA中异常的工作方式,尤其是throw/throws
关键字以及它们的区别
这是一个很好的解释
您可以随时参考以了解更多信息
关于您的问题,您的代码可能没有编译,因为抛出的方法可能没有抛出异常。您可以在方法头中添加抛出异常
,以使其生效,或者您可以尝试将try/catch
封装在另一个处理(捕获)异常
的try/catch
中
那么在这种情况下,谁是另一个处理者
这几乎完全像是catch
子句从未出现过一样,只是稍微增加了一点,即以后不会使用catch子句。例如:
try {
methodWhichCanThrowIOException();
} catch (IOException e) {
throw e;
} catch (Exception e) {
// This won't be hit for IOException
}
因此:
- 如果此代码周围有另一个try/catch语句,则其中的catch块可能会捕获异常
- 否则,假设它是一个已检查的异常,该方法将必须声明它可以抛出该异常(或超类),并且该异常将以正常方式传播到该方法之外
有关所有详细信息,请参阅JLS的和
那么在这种情况下,谁是另一个处理者
这几乎完全像是catch
子句从未出现过一样,只是稍微增加了一点,即以后不会使用catch子句。例如:
try {
methodWhichCanThrowIOException();
} catch (IOException e) {
throw e;
} catch (Exception e) {
// This won't be hit for IOException
}
因此:
- 如果此代码周围有另一个try/catch语句,则其中的catch块可能会捕获异常
- 否则,假设它是一个已检查的异常,该方法将必须声明它可以抛出该异常(或超类),并且该异常将以正常方式传播到该方法之外
有关所有详细信息,请参阅JLS的和。假设您有两种方法
第一个:
public void methodA() throws IOException {
try {
// methodWhichCanThrowIOException();
} catch (IOException e) {
// //perform operations before exits;
throw e;
}
}
第二个:
public void methodB() {
try {
methodA();
} catch (IOException e) {
// //perform operations;
}
}
查看方法B如何调用方法A。最初在方法A内部引发的异常是方法A本身的处理程序,但一旦完成,方法A决定抛出异常,以便其他处理程序有机会处理该异常。注意,方法A可以在不同的类中,在不同的层中
对于方法A,抛出异常是通知方法B发生了什么事情的好方法。假设您有两种方法
第一个:
public void methodA() throws IOException {
try {
// methodWhichCanThrowIOException();
} catch (IOException e) {
// //perform operations before exits;
throw e;
}
}
第二个:
public void methodB() {
try {
methodA();
} catch (IOException e) {
// //perform operations;
}
}
查看方法B如何调用方法A。最初在方法A内部引发的异常是方法A本身的处理程序,但一旦完成,方法A决定抛出异常,以便其他处理程序有机会处理该异常。注意,方法A可以在不同的类中,在不同的层中
对于方法A,抛出异常是通知方法B发生了问题的好方法。谢谢您的回复。在您的示例中,如果抛出的异常的数据类型与IOException匹配,则会在那里捕获它。如果不是,异常将传递到第二个catch语句。现在我假设它被抓到了,所以抛出e代码>导致第二次捕获异常发生。如果是,e
的类型是什么?我认为这是一次又一次的异常,异常不会再发生了@伯纳德:对不起,我完全不明白你的意思——你在哪里做出假设,关于什么?(以“现在我假设”开头的句子对我来说真的没有意义。)如果有让你困惑的具体情况,请在你的问题中发布一个简短但完整的程序。很抱歉让你困惑。我的意思是在你的例子中,第二个catch子句将被执行?@Bernard:只有当方法抛出的异常,而该方法的canthrowIOException
不是IOException
时才会执行。(可能是该方法声明的另一个已检查异常,也可能是未检查异常。)基本上,catch
子句无法捕获同一try
/catch
语句中的其他catch
子句引发的异常。感谢您的回复。在您的示例中,如果抛出的异常的数据类型与IOException匹配,则会在那里捕获它。如果不是,异常将传递到第二个catch语句。现在我假设它被抓到了,所以抛出e代码>导致第二次捕获异常发生。如果是,e
的类型是什么?我认为这是一次又一次的异常,异常不会再发生了@伯纳德:对不起,我完全不明白你的意思——你在哪里做出假设,关于什么?(以“现在我假设”开头的句子对我来说真的没有意义。)如果有让你困惑的具体情况,请发布一个简短但完整的程序