Java 编译器如何知道它java.lang.RuntimeException
及其子类是未经检查的,因为它们继承自java.lang.Exception
,这是一个检查异常?我查看了代码,在类中似乎没有任何东西可以告诉编译器。
问问题
624 次
2 回答
8
因为它在语言# 11.1.1 的规范中是这样定义的:
- 未经检查的异常类是运行时异常类和错误类。
- 已检查异常类是除未检查异常类之外的所有异常类。也就是说,检查的异常类都是 Throwable 的子类,除了 RuntimeException 及其子类和 Error 及其子类。
所以它不是各种异常类代码的一部分,它只是语言定义的约定,编译器必须实现才能兼容。
于 2013-02-14T16:23:37.290 回答
1
它扩展的事实RuntimeException
就足够了。在编译期间,它知道类层次结构是什么,因此如果它包含RuntimeException
,则未选中。否则,它会被检查。请记住,checked/unchecked 是编译器约束,而不是运行时约束,有一些方法可以让 Java 抛出从未被捕获的已检查异常。例如,使用Proxy
:
public class ExceptionalInvocationHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
throw new IOException("Take that, checked exceptions!");
}
}
还有一个界面:
public interface Example {
public void doSomething();
}
并创建一个代理并调用它:
Example ex = (Example) Proxy.newProxyInstance(Example.class.getClassLoader(),
new Class[] { Example.class },
new ExceptionalInvocationHandler());
ex.doSomething(); // Throws IOException even though it's not declared.
于 2013-02-14T16:21:03.287 回答