尝试接住并抛出 - 仍然得到 "unreported exception"

try catch and throw - still get "unreported exception"

关于下面的 Java 代码,NetBeans 抱怨 throw 语句,指出存在“未报告的异常 IOException”,即使我已经捕捉到它...

public class MyClass {
    
    public static java.util.Properties properties = new java.util.Properties();
    static {
        try {
            properties.load(new java.io.FileInputStream("my.properties"));
        }
        catch (java.io.IOException somethingbad) {
            throw somethingbad;
        }
    }
}

如果我更换 throw somethingbad;; 没有抱怨。我想了解这是为什么以及如何正确处理它。如果有这样的异常,我希望程序简单地停止,因此我重新抛出它的原因。

我检查了这个问题的答案unreported IOException even though in try-catch block and throws Exception,但他们没有启发我。

这个class目前是独立的。没有其他 class 引用它。

在Java中有两种异常:

1- Checked Exceptions

2- Unchecked Exceptions

Handle:使用try catch块:可能导致异常的行应该在try块中,异常抛出时的catch块运行。

Declare : 当声明一个可能引发Exception的方法时,可以添加语法: throws Exception_Class_Name 来通知调用者这个方法可能包含一个代码可能会抛出 Exception_Class_Name.

类型的异常

未经检查的异常不会造成问题,因为它们不需要处理或声明,但如果您处理或声明就没有问题。

Checked Exceptions 需要被 Handled 或者 declared (你可以 handle 和 declare同时)。

查看您的示例,您有一个名为 "somethingbad" 的 IOException 类型的异常,在 java 代码中任何肯定抛出 Checked 的行必须处理或声明异常,所以行:

    throw somethingbad;

必须处理或声明,这里你的行在静态块中,我们可以在方法中讨论代码时声明异常,所以这里你需要处理 Exception 使用 try catch 块,将你的行放在 try 中并编写一个 catch 块来捕获此检查异常的确切类型或超类型,如果你需要你的程序停止执行你可以简单地抛出一个未经检查的异常(例如RuntimeException)。

处理 IOEXception :

import java.io.IOException;
public class MyClass {

    public static java.util.Properties properties = new java.util.Properties();
    static {
        try {
            properties.load(new java.io.FileInputStream("my.properties"));
        } catch (IOException somethingbad) {
            try {
                throw somethingbad;
            } catch (IOException e) {
                e.printStackTrace();    

            }
        }
    }
}

抛出未经检查的异常:

import java.io.IOException;
public class MyClass {

    public static java.util.Properties properties = new java.util.Properties();
    static {
        try {
            properties.load(new java.io.FileInputStream("my.properties"));
        } catch (IOException somethingbad) {
            throw new RuntimeException(somethingbad.getMessage());
        }
    }
}

您正在做的是 rethrowing 将相同的异常返回给静态块的调用者。

根据Java specs,静态块抛出检查异常是编译时错误class。

在您的情况下,由于您使用的是 FileInputStream,它最终需要处理 FileNotFoundExceptionIOException,这就是您 rethrow 检查 IOException 它会给你编译时错误。 如果你真的想在这个异常发生后停止你的执行,那么你可以简单地在你的代码块中打印堆栈跟踪:

class MyClass {
    
    public static java.util.Properties properties = new java.util.Properties();
    static {
        try {
            properties.load(new java.io.FileInputStream("my.properties"));
        }
        catch (IOException e) {
           e.printStackTrace(); //just to give info why exception occurred.
        }
    }
}