投掷新的NPE时不需要Java'抛出'条款?为什么添加“throws Exception”会出现编译错误?

时间:2015-03-12 20:51:21

标签: java throws

我对这些&#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.是唯一一个我收到编译错误的人......

3 个答案:

答案 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)与第一个答案相同。两个运行时异常,无需检查。