我有两个版本的代码。在 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
。
未经检查的异常是RuntimeException
、Error
和派生类。 NullPointerException
派生自 RuntimeException
。
关于java - 为什么异常类型会影响编译和不编译的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8617832/