我正在复习OCP,我偶然发现了这个场景,但也有例外。
通常,我们会在try-with-resource中遇到被抑制的异常。如果try块和close()方法都抛出异常,则只会处理try块中的异常。在close()中抛出的异常将被禁止。
我正在尝试其他方法来遇到被抑制的异常。运行methodTwo()只会抛出NullPointerException。它将被捕获,但不会被抑制。IllegalArgumentException怎么了?
public class Main {
public static void main(String[] args) {
try {
methodTwo();
} catch (Exception e) {
e.printStackTrace();
for(Throwable t : e.getSuppressed()) {
System.out.println(t.getMessage());
}
}
}
static void methodTwo() {
try {
throw new IllegalArgumentException("Illegal Argument");
} finally {
throw new NullPointerException("Null Pointer");
}
}
}发布于 2018-10-03 15:05:23
正如注释中提到的,如果发生任何异常或返回,则最终都会执行。这是因为对文件等免费资源的保证,如果你最后没有返回或抛出新的异常,它会返回之前设置的异常或值。您也可以更改在finally块中返回的值,例如:
class A
{
public int value; // it is not good but only for test
}
public class Tester
{
public static void main(String[] args) {
System.out.println(method1().value); // print 10
}
private static A method1() {
A a = new A();
try
{
a.value = 5;
return a;
} finally
{
a.value = 10;
}
}
}你可以抛出异常,而不是抛出新的值,并返回值或丢弃的上一个异常。(但所有这些在编程设计中都不是很好)
当你处理文件时,因为在java中没有像c++那样的析构函数(虽然有,但它是不同的),所以你必须使用try finally (或者对于新的方式,使用try- with - resource )来释放从系统获得的资源。
发布于 2018-10-03 15:03:17
正如@polygenelubricants对here的解释
带有finally块的try语句通过首先执行try块来执行。然后有一个选择:
如果try块的执行正常完成,... ...
)而突然结束语句
有关更多详细信息,请访问
https://stackoverflow.com/questions/52621238
复制相似问题