首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当抛出一个新的NPE时,不需要Java的“抛出”子句?为什么添加“抛出异常”会导致编译错误?

当抛出一个新的NPE时,不需要Java的“抛出”子句?为什么添加“抛出异常”会导致编译错误?
EN

Stack Overflow用户
提问于 2015-03-12 20:51:21
回答 3查看 873关注 0票数 0

我对“抛出”子句感到好奇,并编写了下面的代码(我使用EclipseandJava7)。最初,我只使用块15 (期望编译错误,但没有发生.)然后这让我开始写其他的积木。

代码语言:javascript
代码运行次数:0
运行
复制
// 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和8中的编译错误(未处理的异常?我省略了“抛出”条款)

(d)也许有人也能告诉我为什么6.是我唯一得到编译错误的原因.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-12 21:03:11

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

1) NullPointerException extends RuntimeException,因此编译器不会出现任何错误。

2)即使您的方法抛出NullPointerException,因为您用抛出异常标记了该方法,编译器也警告您在它的调用者中捕获它。

3)与第一次答覆相同

4)与第一答案IllegalArgumentException extends RuntimeException相同

5) throwNPE根本不抛任何东西。

6)即使在NullPointerException (RuntimeException)中抛出一个throwNPEWithGenericClause,但由于将该方法标记为检查异常,编译器也不允许。

7,8)与第一次回答相同。两个运行时异常,不需要检查。

票数 1
EN

Stack Overflow用户

发布于 2015-03-12 20:58:38

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

错误 (由JVM引发,如果发生致命错误,则为occoures)

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

RuntimeException (所有未经检查的异常都继承自此)

都是暴徒

票数 3
EN

Stack Overflow用户

发布于 2015-03-12 20:55:30

RuntimeException或未检查的异常实例(如NPE )不需要抛出/捕获。它们可以被捕获,但是通常您不想这样做,因为它表示程序流异常,并且应该终止程序。一般来说,如果不可能继续下去,那么它将作为一个RuntimeException终止。如果您想阻止对空值的某种操作,那么应该检查它是否为空,而不是期望NPE。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29019958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档