我正在审查OCP,偶然发现了这种情况与异常。
通常,我们在try-with-resource中遇到抑制异常。如果try块和close()方法都抛出Exception,则仅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");
}
}
}
答案 0 :(得分:0)
最终总是在发生任何异常或返回时执行。这是因为保证了诸如文件等的自由资源。如果您最终不返回或引发新的异常,则它将返回之前设置的异常或值。 您也可以更改在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;
}
}
}
您可以抛出异常,而不是也抛出新值,并丢弃返回值或最后一个异常。 (但是所有这些在编程设计中都是不好的)
在处理文件时,因为像c ++这样的java中没有像析构函数那样的东西(尽管有,但最终有所不同),所以必须使用try finally(或对于新方法,使用try-with-resource)来释放资源从系统获取。
答案 1 :(得分:-1)
正如@polygenelubricants here所解释的
带有finally块的try语句通过首先执行try块来执行。然后有一个选择:
- 如果try块的执行正常完成,[...]
- 如果由于抛出值V而导致try块的执行突然完成,[...]
- 如果try块的执行由于其他任何原因R突然完成,则将执行finally块。然后有一个选择:
- 如果finally块正常完成,则[...]
- 如果finally块由于原因S突然完成,那么try语句由于原因S突然完成(并且原因R被丢弃)。
有关更多详细信息,请转到oracle documentation