我对这些&#39;投掷感到好奇。子句并编写了以下代码(我使用Java与Java7)。最初我开始只使用块 1 和 5 (期待编译错误,但没有发生......)然后这导致我编写其他块。< / p>
// 1
public void throwNPE() {
throw new NullPointerException();
}
// 2
public void throwNPEWithGenericClause() throws Exception {
throw new NullPointerException();
}
// 3
public void throwNPEWithNPEClause() throws NullPointerException {
throw new NullPointerException();
}
// 4
public void throwNPEWithIAEClause() throws IllegalArgumentException {
throw new NullPointerException();
}
// 5
public void callThrowNPE() {
throwNPE();
}
// 6
public void callThrowNPEWithGenericClause() {
throwNPEWithGenericClause(); // COMPILATION ERROR
}
// 7
public void callThrowNPEWithNPEClause() {
throwNPEWithNPEClause();
}
// 8
public void callThrowNPEWithIAEClause() {
throwNPEWithIAEClause();
}
说实话,我原以为:
(a) 1中的编译错误。(未处理的异常?不应该是我的方法通知任何&#39;后续调用者&#39;这将导致某种类型的例外?)
(b) 4.中的某种问题(可能是编译错误?我在“IAE”条款中抛出NPE)
(c) 5. 5. 7.和8.中的编译错误。(未处理的例外情况?我省略了&#39; throws&#39;子句)
(d)也许有人也可以告诉我为什么6.是唯一一个我收到编译错误的人......
答案 0 :(得分:3)
Java中的异常可以分为三种不同的基类型:
Error(如果发生致命错误,则由JVM抛出)
Exception(所有已检查的例外都是从此继承的)
RuntimeException(所有未经检查的异常都从此继承)
全部为Throwables
答案 1 :(得分:1)
RuntimeException或未经检查的异常实例(如NPE)不需要抛出/捕获。它们可以被捕获,但通常你不想要,因为它表示程序流程异常,它应该终止程序。通常,如果没有可能继续,那么它将作为RuntimeException终止。如果要阻止对null值执行某种操作,则应检查它是否为null而不是期望NPE。
答案 2 :(得分:1)
RuntimeException ,因此当您抛出 RuntimeException 的异常子类时,编译器不会发出警告。如果您需要编译器来警告您,那么您应该使用 Exception 或其子类。
1)NullPointerException extends RuntimeException
所以编译器不会给出任何错误。
2)即使您的方法抛出NullPointerException,因为您使用 throws Exception 标记了该方法,编译器会警告您在其调用者中捕获它。
3)与第一个答案相同
4)与第一个答案相同
IllegalArgumentException extends RuntimeException
5)throwNPE根本不会抛出任何东西。
6)尽管你在throwNPEWithGenericClause中抛出NullPointerException(RuntimeException),因为你将方法标记为已检查的异常,编译器不允许。
7,8)与第一个答案相同。两个运行时异常,无需检查。