以下是如何正确的?我希望编译器告诉我使用throws Exception或throws RuntimeException
public void method1() throws NullPointerException {
throw new RuntimeException();
}
Run Code Online (Sandbox Code Playgroud)
为什么我认为它不正确 - > Bcoz 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();
}
Run Code Online (Sandbox Code Playgroud)
回答:
对于RTE即使你没有throws为方法添加子句,编译器也不会说什么
public void method6() { // no compile time errors!!
throw new NullPointerException();
}
Run Code Online (Sandbox Code Playgroud)
但是当我们明确地说' 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 {
}
Run Code Online (Sandbox Code Playgroud)
你误会了.
已检查的异常是在编译时检查的异常(因此它们的名称).因此,如果您有doFoo抛出异常的方法,则BarException必须声明该方法抛出BarException:
void doFoo() throws BarException { }
Run Code Online (Sandbox Code Playgroud)
未经检查的异常是编译器未检查的异常,因此您不必声明抛出异常
说throw new Exception()只是抛出一个已检查异常的新实例,或者在RuntimeException的情况下取消选中.检查因子的情况仅在您使用该throw子句实际抛出已检查的异常时.
至于它是否是一个缺陷,现在这是一个非常自以为是的主题.使用抛出大量未经检查的异常的API而不记录它们抛出这些异常往往会令人讨厌.但是,有时可能会出现基于应用程序的唯一运行时状态而发生的异常,您无法声明可能会抛出某个已检查的异常,这就是运行时异常闪耀的地方(如NullPointerException)
| 归档时间: |
|
| 查看次数: |
8236 次 |
| 最近记录: |