是否仅在尝试资源代码中遇到抑制异常?

时间:2018-10-03 06:50:25

标签: java exception exception-handling

我正在审查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"); 
        }
    }
  }

2 个答案:

答案 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