下面的说法正确的是?我希望编译器告诉我使用 throws Exception
或throws RuntimeException
public void method1() throws NullPointerException {
throw new RuntimeException();
}
为什么我认为它不正确 -> 因为 NPE 是 RTE,但 RTE 不是 NPE
这怎么是正确的?我希望编译器告诉我使用 throws Exception
或throws RuntimeException
或throws NumberFormatException
public void method2() throws NullPointerException {
throw new NumberFormatException();
}
public void method3() throws Exception { // this is fine, as expected
throw new RuntimeException();
}
public void method4() throws RuntimeException { // this is fine, as expected
throw new NullPointerException();
}
public void method5() throws Exception { // this is fine, as expected
throw new NullPointerException();
}
答案:
对于 RTE,即使您不添加 throws
方法的子句,编译器不会说什么
public void method6() { // no compile time errors!!
throw new NullPointerException();
}
但是当我们明确地说“throw new NullPointerException();
”时' ,为什么编译器会忽略它?
它与'throw new SQLException()
相同;'
如果某些对象被评估为 null,并在该 null 对象上调用了操作,则不会在运行时抛出该错误。
通常,一个函数必须声明它可以抛出的所有异常,但 RTE 却绕过了它!
RTE 是未经检查的异常。但是当你说抛出新的 RTE 时,仍然没有检查?!
问题 - 这不是一个缺陷吗?或者请纠正我理解为什么会这样
- 更新:
请注意,这个问题不是关于检查异常和未检查异常之间的区别。 问题不在于任何类型的异常或错误之间的区别。
问题是为什么显式标记的 RunTimeException 没有被处理,或者没有强制编译器处理它。
例如:
public void methodA() { // methodA is not forced to handle the exception.
methodB();
}
public void methodB() throws RuntimeException {
}
最佳答案
你误会了。
检查异常是在编译时检查的异常(因此得名)。因此,如果您有方法 doFoo
抛出异常 BarException
,您必须声明该方法抛出 BarException :
void doFoo() throws BarException { }
未经检查的异常是编译器不检查的异常,因此您不必声明抛出它们
说throw new Exception()
仅仅抛出一个已检查异常的新实例,或者在 RuntimeException 的情况下抛出未检查的异常。仅当您实际使用 throw
抛出已检查异常时,才会考虑检查因素。条款。
至于它是否是一个缺陷,现在这是一个非常固执己见的话题。使用抛出大量未经检查的异常而不记录它们抛出这些异常的 API 往往是相当烦人的。但是,有时可能会出现基于应用程序的独特运行时状态而发生的异常,在这种情况下,您无法声明可能抛出某个已检查的异常,而这正是运行时异常的亮点(例如 NullPointerException
)
关于java:抛出运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22996407/