禁止的异常是否仅在试用资源代码中遇到?



我正在审查 OCP,我偶然发现了这种情况和异常。

通常,我们在资源尝试中遇到抑制异常。 如果 try block 和 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"); 
}
}
}

如注释所述,如果发生任何异常或返回,最终总是执行。 这是因为对文件等免费资源的保证。 如果您不返回或抛出新的异常,它会返回之前设置的异常或值。 您也可以更改返回 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 Final(或者对于新的方式,使用try-with-resource(来释放从系统获得的资源。

正如@polygenelubricants所解释

的那样

带有 finally 块的 try 语句通过首先执行 try 块来执行。然后有一个选择:

  • 如果 try 块的执行正常完成,[...]
  • 如果 try 块的执行由于抛出值 V 而突然完成,[...]
  • 如果 try 块的执行由于任何其他原因 R 而突然完成,则执行 finally 块。然后有一个选择:
    • 如果最终块正常完成,[...]
    • 如果 finally 块由于原因 S 而突然完成
    • ,则 try 语句由于原因 S 而突然完成(并且原因 R 被丢弃(。

有关更多详细信息,请转到预言机文档

相关内容

最新更新