Java';抛出';抛出新NPE时不需要子句?为什么要加上“;抛出异常“;给出编译错误?
我对“throws”子句感到好奇,并编写了以下代码(我使用Eclipse和Java7)。最初我只开始使用块1和5(预期编译错误,但没有发生…),然后这导致我编写其他块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
// 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中,异常类型的意思是!谢谢你一步一步的解释!谢谢你一步一步的解释!