下面的代码正确吗?我以为编译器会提示我使用
但是,当我们明确地说 '
这与 '
如果某个对象被计算为空并在该空对象上调用操作,则不会在运行时抛出异常。
通常,函数必须声明其可能抛出的所有异常,但是RTE可以绕过此规定!
RTE是未经检查的异常。但是,当您说throw new RTE时,仍然是未经检查的?
问题 - 这不是一个缺陷吗?还是请纠正我对为什么会这样的理解。
更新:
请注意,这个问题不涉及已检查的异常和未检查的异常之间的区别。这个问题也不是关于任何类型的异常或错误之间的区别。
问题是为什么标记为RunTimeException的异常没有被处理,或者没有强制编译器处理它。
例如:
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()
;' 相同。如果某个对象被计算为空并在该空对象上调用操作,则不会在运行时抛出异常。
通常,函数必须声明其可能抛出的所有异常,但是RTE可以绕过此规定!
RTE是未经检查的异常。但是,当您说throw new RTE时,仍然是未经检查的?
问题 - 这不是一个缺陷吗?还是请纠正我对为什么会这样的理解。
更新:
请注意,这个问题不涉及已检查的异常和未检查的异常之间的区别。这个问题也不是关于任何类型的异常或错误之间的区别。
问题是为什么标记为RunTimeException的异常没有被处理,或者没有强制编译器处理它。
例如:
public void methodA() { // methodA is not forced to handle the exception.
methodB();
}
public void methodB() throws RuntimeException {
}