首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 7检查异常规则

Java 7检查异常规则
EN

Stack Overflow用户
提问于 2014-06-13 12:02:15
回答 2查看 161关注 0票数 2

我知道检查异常的规则,但我不能完全解决这个难题。为什么第二个方法不编译,而第一个方法编译呢?该错误是“未处理的异常类型异常”上的最后一个抛出语句。我能理解为什么我会得到这个错误,但我不明白为什么第一个方法是可以的,它应该有同样的问题?!

eclipse和intellij都显示了相同的错误。

代码语言:javascript
复制
import java.util.concurrent.Callable;

public class ThrowableWeirdness {

    public void doWithMetrics(String name, Runnable runnable) {

        try {
            runnable.run();
        } catch (Throwable e) {
            System.out.printf(name + ".failed");
            throw e;
        }
    }

    public <RET> RET doWithMetrics(String name, Callable<RET> runnable) {

        try {
            return runnable.call();
        } catch (Throwable e) {
            System.out.printf(name + ".failed");
            throw e; // Compilation error on this line: unhandled exception
        }
    }
}

你能解释一下这两种方法的区别吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-13 12:06:22

  • 在第一种情况下,runnable.run不会抛出任何已检查的Exception,因此不会推断您的try/catch和重新抛出会抛出检查过的任何内容,因此它会编译
  • 在第二个例子中,runnable.call()抛出Exception并被处理,但随后重新抛出。

为了在本例中修复编译,必须将throws语句添加到方法声明中。

票数 5
EN

Stack Overflow用户

发布于 2014-06-13 12:12:42

从Java 7开始,编译器检查try块以检查实际上会引发什么例外情况

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

如果将源代码级别设置为1.6,它们都不会编译。

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

https://stackoverflow.com/questions/24204824

复制
相关文章

相似问题

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