首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >作为异常重新抛出RuntimeException

作为异常重新抛出RuntimeException
EN

Stack Overflow用户
提问于 2021-08-03 11:22:44
回答 1查看 199关注 0票数 2

Java允许我编译以下代码,没有任何问题:

代码语言:javascript
复制
public class Test {
    public static void main(String[] args){
        try {
            throw new RuntimeException();
        } catch (Exception e) {
            throw e;
        }
    }
}

尽管java.lang.Exception是一个检查异常。这意味着我正在重新抛出未经检查的异常作为检查,然后就可以了。

很可能Java编译器能够发现在try块中没有抛出检查过的异常,但我无法在规范中找到备份该异常的部分。

我们能否依赖这种行为,并从哪个JDK版本开始呢?

Update:该类不使用Java 1.6.0_38编译,其消息如下:

代码语言:javascript
复制
Test.java:6: unreported exception java.lang.Exception; must be caught or declared to be thrown
            throw e;
            ^
1 error
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-03 14:43:11

看起来这是Java7:用改进的类型检查捕获多个异常类型并重新抛出异常中增强的效果之一。参见节“用更具包容性的类型检查重新抛出异常”一节,

Java 7编译器可以确定语句抛出e所引发的异常一定来自try块,由try块引发的唯一异常可以是FirstException和SecondException。即使catch子句e的异常参数是类型异常,编译器也可以确定它是FirstException或SecondException的实例。

请注意,即使在Java 7和更高版本中,以下内容也不会编译:

代码语言:javascript
复制
public class Test {
    public static void main(String[] args){
        try {
            throw new RuntimeException();
        } catch (Exception e) {
            Exception e1 = e;
            throw e1;
        }
    }
}

因为:

如果catch参数分配给catch块中的另一个值,则禁用此分析。

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

https://stackoverflow.com/questions/68635149

复制
相关文章

相似问题

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