【发布时间】:2014-04-10 18:42:34
【问题描述】:
下面这一项如何正确?我希望编译器告诉我使用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 是未经检查的异常。但是当你说 throw new RTE 时,仍然没有选中?!
问题 - 这不是缺陷吗?或者请纠正我理解为什么会这样
- 更新:
请注意,这个问题不是关于已检查异常和未检查异常之间的区别。 问题不在于任何类型的异常或错误之间的区别。
问题是为什么不处理显式标记的 RunTimeException,或者不强制编译器处理它。
例如:
public void methodA() { // methodA is not forced to handle the exception.
methodB();
}
public void methodB() throws RuntimeException {
}
【问题讨论】:
-
谢谢,有很多信息,我只介绍了一些。但是此刻,我的脑海中浮现的是——为什么显式抛出的 RTE 在 Java 中被归类为未经检查的异常?
-
不要将 unchecked 解读为编译器看不到的内容。 unchecked 仅仅意味着它不必被处理。
-
因为它们就是这样设计的。
-
这太宽泛了,无法在这里回答。如果你真的有兴趣,网上有很多关于它的争论。
标签: java