java - 为什么异常类型会影响编译和不编译的内容?

标签 java exception

我有两个版本的代码。在 Method() 中引发的异常类型的第一个版本中 - NullPointerException,在第二个版本中 - Exception。但是,第一个版本可以编译,但第二个版本无法编译。为什么会出现这种情况?

public class Demo
{
    static void Method()
    {
        try
        {
            throw new NullPointerException("error");
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }
    public static void main(String argv[])
    { 
        try
        {
            Method();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

这是第二个版本。

public class Demo
{
    static void Method()
    {
        try
        {
            throw new Exception("error");
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }
    public static void main(String argv[])
    { 
        try
        {
            Method();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

第一个版本的堆栈跟踪:

java.lang.NullPointerException: error
    at Demo.Method(Demo.java:7)
    at Demo.main(Demo.java:18)

最佳答案

这是因为 NullPointerException 是所谓的“未经检查”异常。您不需要在 throws 子句中声明它们。

但是,偶然的异常不会未经检查,并且您确实需要在抛出声明中进行声明。您需要在第二个代码片段中使 Method() 抛出 Exception

未经检查的异常是RuntimeExceptionError和派生类。 NullPointerException 派生自 RuntimeException

关于java - 为什么异常类型会影响编译和不编译的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8617832/

相关文章:

java - java和kotlin参数有效可见性冲突

python - wifiphisher 追溯。输入AP数量后出错

java - 在 Java 中使用数组的简单 HashTable 实现?

java - JavaFx 中 BACKSPACE 的键码事件

java - JSoup - 选择多个项目

c# - NullReferenceException 与 ArgumentNullException

c# - 从 C# .NET Windows 应用程序调用 C++ dll 时出现运行时错误

c# - 如何使用作用域 JsConfig 返回/抛出 ServiceStack 的 HttpError?

C++:使用 try/catch 访问未知大小的数组

java - 如何通过读取 JSON 来修复 UnrecognizedPropertyException?