出自《java puzzle》
本谜题测试的是你对某些规则的掌握程度,这些规则用于声明从方法中抛出并被catch语句块所捕获的异常。下面的三个程序每一个都会打印些什么?不要假设它们都可以通过编译:
import java.io.IOException;
public class Arcane1 {
public static void main(String[] args) {
try {
System.out.println("Hello world");
} catch(IOException e) {
System.out.println("I've never seen println fail!");
}
}
}
public class Arcane2 {
public static void main(String[] args) {
try {
// If you have nothing nice to say, say nothing
} catch(Exception e) {
System.out.println("This can't happen");
}
}
}
interface Type1 {
void f() throws CloneNotSupportedException;
}
interface Type2 {
void f() throws InterruptedException;
}
interface Type3 extends Type1, Type2 {
}
public class Arcane3 implements Type3 {
public void f() {
System.out.println("Hello world");
}
public static void main(String[] args) {
Type3 t3 = new Arcane3();
t3.f();
}
}
第一个程序,Arcane1,展示了被检查异常的一个基本原则。它看起来应该是可以编译的:try子句执行I/O,并且catch子句捕获IOException异常。但是这个程序不能编译,因为println方法没有声明会抛出任何被检查异常,而IOException却正是一个被检查异常。语言规范中描述道:如果一个catch子句要捕获一个类型为E的被检查异常,而其相对应的try子句不能抛出E的某种子类型的异常,那么这就是一个编译期错误[JLS 11.2.3]。
基于同样的理由,第二个程序,Arcane2,看起来应该是不可以编译的,但是它却可以。它之所以可以编译,是因为它唯一的catch子句检查了Exception。尽管JLS在这一点上十分含混不清,但是捕获Exception或Throwble的catch子句是合法的,不管与其相对应的try子句的内容为何。尽管Arcane2是一个合法的程序,但是catch子句的内容永远的不会被执行,这个程序什么都不会打印。
第三个程序,Arcane3,看起来它也不能编译。方法f在Type1接口中声明要抛出被检查异常CloneNotSupportedException,并且在Type2接口中声明要抛出被检查异常InterruptedException。Type3接口继承了Type1和Type2,因此,看起来在静态类型为Type3的对象上调用方法f时,有潜在可能会抛出这些异常。一个方法必须要么捕获其方法体可以抛出的所有被检查异常,要么声明它将抛出这些异常。Arcane3的main方法在静态类型为Type3的对象上调用了方法f,但它对CloneNotSupportedException InterruptedExceptioin并没有作这些处理。那么,为什么这个程序可以编译呢?
上述分析的缺陷在于对“Type3.f可以抛出在Type1.f上声明的异常和在Type2.f上声明的异常”所做的假设。这并不正确,因为每一个接口都限制了方法f可以抛出的被检查异常集合。一个方法可以抛出的被检查异常集合是它所适用的所有类型声明要抛出的被检查异常集合的交集,而不是合集。因此,静态类型为Type3的对象上的f方法根本就不能抛出任何被检查异常。因此,Arcane3可以毫无错误地通过编译,并且打印Hello world。
总之,第一个程序说明了一项基本要求,即对于捕获被检查异常的catch子句,只有在相应的try子句可以抛出这些异常时才被允许。第二个程序说明了这项要求不会应用到的冷僻案例。第三个程序说明了多个继承而来的throws子句的交集,将减少而不是增加方法允许抛出的异常数量。本谜题所说明的行为一般不会引发难以捉摸的bug,但是你第一次看到它们时,可能会有点吃惊。
分享到:
相关推荐
谜题37:极端不可思议 谜题38:不受欢迎的宾客 谜题39:您好,再见 谜题40:不情愿的构造器 谜题41:域和流 谜题42:异常为循环而抛 谜题43:异常地危险 谜题44:删除类 谜题45:令人疲惫不堪的测验 .....
谜题37:极端不可思议 79 谜题38:不受欢迎的宾客 81 谜题39:您好,再见 .83 谜题40:不情愿的构造器 85 谜题41:字段和流 87 谜题42:异常为循环而抛 89 谜题43:异常地危险 93 谜题44:删除类 97 谜题45...
循环者的诅咒 45 谜题33:循环者遇到了狼人 46 谜题34:被计数击倒了 48 谜题35:一分钟又一分钟 49 Java谜题4——异常谜题 50 谜题36:优柔寡断 51 谜题37:极端不可思议 52 谜题38:不受欢迎...
谜题37:极端不可思议 谜题38:不受欢迎的宾客 谜题39:您好,再见 谜题40:不情愿的构造器 谜题41:域和流 谜题42:异常为循环而抛 谜题43:异常地危险 谜题44:切掉类 谜题45:令人疲惫不堪的测验 Java...
其计算的极端气候指数共有27 种,包括16 个极端温度指数和11 个极端降水指数,这27 个极端气候指数都是世界气象组织气候委员会推荐使用的核心极端气候指数。根据内蒙的实际情况和研究的需要,选择10 个极端气温指数...
极端气候软件用户手册,英文全解,安装步骤,操作使用步骤,以及注意事项
我们研究了在低能量和低温下极端和近端黑洞的行为,发现可以从近视AdS 2区域理解它。 我们的分析包括带电物质,而且还超出了S波近似。 我们发现低能量下的超前行为是由与时间重新参数化相关的模式和由规范场产生的...
极端天气安全设施检查记录表--消防设施.pdf
我们表明,从普朗克鳞片到大约109 g的质量范围较广的原始(近乎)极端黑洞在宇宙学上是稳定的,并为暗物质提供了可行的解释,因为它具有暗电磁力和暗电子。 Hawking辐射和Schwinger放电过程分别被近端电子和暗电子的...
针对极端偏好成员在应急决策中存在较大影响力的问题,构建了个体极端偏好影响力模型,结合风险偏好矢量的方向性和距离性提出了一种新的决策成员风险偏好相似度模型,并...
南洋理工大学黄教授的极端学习机的代码 在java上实现的
包括Rx5day、CDD、R95
我们表明,Reissner-Nordström黑洞的AdS2×S2近地平线几何形状没有得到校正,但是随着我们打开角动量,出现了关于极端Kerr-Newman解的偏差。 我们使用数值方法和缓慢旋转扩展来构造这些校正后的几何形状的轮廓,...
什么是极端编程? 极端编程(eXtreme Programming)是一种开发纪律,以简单性、交流、反馈和勇气为基本宗旨。
中国山西省持续高温,大雨或突然的寒潮等极端天气事件给人们的生产和生活带来了巨大的损失和灾难。 研究极端天气事件的时空分布特征和环流背景场具有重要的现实意义。 我们从1981年至2010年从中国山西省的109个气象...
极端天气施工方案及保证措施.pdf
本文来自新的云探测指数(CDI),可用于预测极端天气事件,例如大雨或极端降雨。 CDI使用云形成的两个关键要素(关键湿度和关键水蒸气)进行检索。 通过使用位于印度西部孟买的无线电探空仪站点(VABB)的CDI确定云...
极端报复社会犯罪研究.docx
去极端化工作半年总结.pdf
远离宗教极端思想实施方案.pdf