Java 被抑制的异常是否仅在“使用资源进行尝试”代码中遇到?

Java 被抑制的异常是否仅在“使用资源进行尝试”代码中遇到?,java,exception,exception-handling,Java,Exception,Exception Handling,我正在复习OCP,我偶然发现了这个场景,但有例外 通常,我们在try with resource中会遇到被抑制的异常。如果try block和close()方法都抛出异常,则只处理try block中的异常。close()中引发的异常将被抑制 我正在尝试其他方法来遇到被抑制的异常。运行methodTwo()只会抛出NullPointerException。它将被捕获,但不会被抑制。“IllegalArgumentException”发生了什么事 public class Main {

我正在复习OCP,我偶然发现了这个场景,但有例外

通常,我们在try with resource中会遇到被抑制的异常。如果try block和close()方法都抛出异常,则只处理try block中的异常。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"); 
        }
    }
  }
如@Polygene润滑油所述

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

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

有关更多详细信息,请转到注释中提到的

,如果发生任何异常或返回,最后总是执行。这是因为文件等免费资源的保证。如果您最后不返回或抛出新异常,它将返回以前设置的异常或值。 您也可以更改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++那样的析构函数(虽然最终是不同的),但是你必须使用java(或者用新的方法,使用试用资源)来从系统中获得资源。

最后的块总是被执行,除非你退出了运行时。@我也把它标记为复制品。所以,可能是根据你,我们不必给予信贷的人和参考链接时,复制答案。然后它将不会被标识为复制粘贴。对的