Java';抛出';抛出新NPE时不需要子句?为什么要加上“;抛出异常“;给出编译错误?

Java';抛出';抛出新NPE时不需要子句?为什么要加上“;抛出异常“;给出编译错误?,java,throws,Java,Throws,我对“throws”子句感到好奇,并编写了以下代码(我使用Eclipse和Java7)。最初我只开始使用块1和5(预期编译错误,但没有发生…),然后这导致我编写其他块 // 1 public void throwNPE() { throw new NullPointerException(); } // 2 public void throwNPEWithGenericClause() throws Exception { throw new NullPointerExcept

我对“throws”子句感到好奇,并编写了以下代码(我使用Eclipse和Java7)。最初我只开始使用块15(预期编译错误,但没有发生…),然后这导致我编写其他块

// 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中的编译错误。(未处理的异常?我的方法是否应该通知任何“后续调用方”这将引发某种异常?)

(b)4中的某种问题。(可能是编译错误?我正在抛出一个NPE,而该子句显示IAE)

(c)5中的编译错误。6.7.八,。(未处理的异常?我省略了“抛出”条款)


也许有人能告诉我为什么。是唯一一个出现编译错误的实例…

或未检查的异常实例(如NPE)不需要抛出/捕获。它们可以被捕获,但通常您不想被捕获,因为这表明程序流异常,应该终止程序。通常,如果不可能继续,那么它将作为运行时异常终止。如果要防止对空值执行某种操作,则应检查该值是否为空,而不是预期为NPE。

或未检查的异常实例(如NPE)不需要抛出/捕获。它们可以被捕获,但通常您不想被捕获,因为这表明程序流异常,应该终止程序。通常,如果不可能继续,那么它将作为运行时异常终止。如果要防止对空值执行某种操作,则应检查它是否为空,而不是预期为NPE。

Java中的异常可分为三种不同的基本类型:

(如果发生致命错误,则由JVM抛出)

(所有选中的异常都继承自此异常)

(所有未选中的异常都继承自此)


都是

Java中的异常可以分为三种不同的基本类型:

(如果发生致命错误,则由JVM抛出)

(所有选中的异常都继承自此异常)

(所有未选中的异常都继承自此)


所有都是RuntimeException未选中,因此当您抛出RuntimeException的exceptions子类时,编译器不会发出警告。如果您需要编译器来警告您,那么您应该使用Exception或其子类

1)
NullPointerException扩展了RuntimeException
所以编译器不会给出任何错误

2) 即使您的方法抛出NullPointerException,但由于您将该方法标记为抛出Exception,编译器警告您在其调用者中捕获它

3) 与第一个答案相同

4) 与第一个答案相同
IllegalArgumentException扩展了RuntimeException

5) throwNPE一点也不扔东西

6) 即使您在throwNPEWithGenericClause中抛出NullPointerException(RuntimeException),因为您将该方法标记为checked exception,编译器也不允许


7、8)与第一个答案相同。两个运行时异常,无需检查。

RuntimeException未选中,因此当您抛出异常子类RuntimeException时,编译器不会发出警告。如果您需要编译器来警告您,那么您应该使用Exception或其子类

1)
NullPointerException扩展了RuntimeException
所以编译器不会给出任何错误

2) 即使您的方法抛出NullPointerException,但由于您将该方法标记为抛出Exception,编译器警告您在其调用者中捕获它

3) 与第一个答案相同

4) 与第一个答案相同
IllegalArgumentException扩展了RuntimeException

5) throwNPE一点也不扔东西

6) 即使您在throwNPEWithGenericClause中抛出NullPointerException(RuntimeException),因为您将该方法标记为checked exception,编译器也不允许


7、8)与第一个答案相同。两个运行时异常都不需要检查。

了解未检查的异常。您不必捕获和处理运行时异常,如
NullPointerException
IllegalArgumentException
。请看,这是一个游戏规则改变者。谢谢,我会看看的!了解未检查的异常。您不必捕获和处理运行时异常,如
NullPointerException
IllegalArgumentException
。请看,这是一个游戏规则改变者。谢谢,我会看看的@克里斯蒂安·库特贝克是对的。此外,“throws”并不意味着异常应该在try-catch中,异常类型的意思是@克里斯蒂安·库特贝克是对的。此外,“throws”并不意味着异常应该在try-catch中,异常类型的意思是!谢谢你一步一步的解释!谢谢你一步一步的解释!