我有两个版本的代码。在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)
答案 0 :(得分:6)
这是因为NullPointerException
是一个所谓的“未经检查”的例外。您无需在throws
子句中声明它们。
但是,偶然Exception
未未选中,而您执行需要在throws
声明中声明。您需要在第二个代码段中Method()
抛出Exception
。
未经核实的例外有RuntimeException
,Error
和衍生类。 NullPointerException
衍生自RuntimeException
。
答案 1 :(得分:2)
NullPointerException
是RunTimeException
(或未经检查),无需在编译时处理。但是,Exception
被视为已检查的异常,必须由遇到它的任何方法捕获或抛出。
可以通过更改方法声明来修复第二个片段,如下所示:
static void Method() throws Exception
答案 2 :(得分:2)
由于您的方法“Method()”抛出Exception
,您必须在方法签名上声明它:
static void Method() throws Exception
它会编译。 干杯!
答案 3 :(得分:1)
试试这个作为第二个例子:
public class Demo
{
static void Method() throws Exception
{
try
{
throw new Exception("error");
}
catch(Exception ex)
{
throw ex;
}
}
public static void main(String argv[])
{
try
{
Method();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
这应该编译好,
答案 4 :(得分:1)
版本1的代码不能在java版本6或更低版本中编译,我猜你使用的是java 7.
Java 7着眼于编译时,确实会抛出异常类型。在案例1中,它是一个运行时异常,它不会出现在方法的签名中。