出自《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:令人疲惫不堪的测验 Java...
谜题2:极端不可思议 这个谜题包含三个不同的程序: 1. 第一个程序`Arcane1`:在这里,`try`块试图打印“Hello world”,并捕获`IOException`。通常,`System.out.println`不会抛出`IOException`,因此捕获异常的...
【标题】和【描述】提及的是“不可思议的宇宙真相”,主要涵盖了关于宇宙中的一些奇特现象和事实,包括冥王星的冰层特性、行星的自转与公转规律、太空环境对人体的影响以及月亮与地球之间的潮汐作用。下面将详细阐述...
同时,故事中的竞争和奖励机制也反映了社会中的一些价值观,教导孩子们要有目标,勇于追求,并且在追求过程中要保持理智,避免极端的行为。 总的来说,"The Most Incredible Thing"是一部寓教于乐的英语童话,它...
文章中提及的“人类历史上闻所未闻、最不可思议的事”不仅令人感到震惊,也引人深思。在短短的时间里,南极点被两个团队先后发现,而斯科特和他的队伍却在这场人类挑战极限的竞赛中屈居亚军。 斯科特团队的探险之旅...
在书中,鹩哥老毛和徐娘因为连续失去鸟蛋,被蛇雕的天敌威胁,选择了一条看似不可思议的道路——成为蛇雕的“奴隶”。它们帮助蛇雕清理巢穴,以换取蛇雕的保护,这是一种自然界的共生关系,但并非常见的共栖或互利...
苔藓可以长时间保持湿润和柔软,即便在极端的环境中也不会腐烂。 苔藓在时间的维度中展现出了另一种存在形式,即“苔藓时间”。这种时间概念并不是一般意义上的时间流逝,而是一种静态的、存在于想象深处的存在。它...
比如使用“模棱两可”来描述科学家们在黑洞信息悖论中的困惑,或者使用“不可思议”来形容黑洞奇点的极端特性。这样的语言训练不仅丰富了学生的词汇,更帮助他们在理解深奥理论时,能够更加清晰和精确地表达自己的...
这个不可思议的例子不仅揭示了生命的顽强和生物维持生命的复杂机制,也让我思考科学在动物生存问题上的潜在应用。虽然现实生活中我们很少会遇到类似的极端情况,但这个故事激发了我对生命科学深层次探索的兴趣。 在...
成语的使用则要求学生能够根据不同的语境选择恰当的成语来表达意思,如“不可思议”用于形容大力气挣脱束缚,既形象又准确。 语病判断和标点符号使用则是对学生语言表达能力的检验。语病的判断要求学生能够识别并...
- **荒谬绝伦**:形容事情极端荒谬,无可比拟。常用来形容那些极其荒唐、不可思议的情况。 ### 知识点二:语病的识别与修正 #### 1. 句子成分的完整性和逻辑性 - 在分析句子是否有语病时,需要注意句子的主谓宾...
5. **语病判断**:试题测试了学生对语病的识别,如"能否作出准确预报"与"对减小极端天气危害起着巨大作用"之间存在两面对一面的问题,"改善杭州城市知名度、美誉度和竞争力"中"改善"应改为"提升"。 6. **标点符号...
10. 不可思议:现在多用来形容事情难以想象和理解。在2009年浙江和2010年9月联考中,分别作为正确和干扰选项。 11. 不可一世:形容极端的自大和傲慢。在2008年上海和2009年北京社招考试中,此成语均为干扰选项。 ...
- **无所不至**可以指到任何地方,也可以形容做事极端,甚至包括坏事。 6. **一蹴而就**与**一挥而就**: - **一蹴而就**比喻事情轻而易举就能完成,常用于描述成功的快速和容易。 - **一挥而就**通常用于形容...
将这三部分组合起来,“匪夷所思”这个成语字面意思就是“不是普通人所能够想象的”,进而引申为指事物极端离奇,超出了常人的认知范围和想象能力,令人难以置信。 在现代汉语的使用场合中,“匪夷所思”多用来形容...
- **不名一钱**:形容极端贫穷。 - **不值一钱**:形容完全没有价值。 10. **不赞一词 VS 不容置喙** - **不赞一词**:指文章写得好,无需修改。 - **不容置喙**:不允许别人插嘴或发表意见。 11. **改弦更张 ...
2. **适应环境**:依米花在沙漠中生长,适应了极端条件,这提示我们在IT领域,无论是开发者还是项目经理,都需要具备适应新技术、新环境的能力。例如,从传统编程转向云计算,或是从桌面应用转向移动应用,都需要...
- **不可思议**:无法理解或想象,形容事情非常神奇或难以置信。 - **荒谬**:极端不合理或错误的行为或想法。 ### 5. 课文细节 - 通过鲁滨孙的决心和行动,展现了一个勇敢面对挑战的人物形象。例如,他尝试修理...
此篇章通过描述在极端环境下葵花的成长过程,展现了生命力的强大与坚韧,同时也借葵花的形象赞美了边防战士们的坚强意志与无私奉献。 ### 重点知识点解析 #### 一、文本背景介绍 - **故事背景**:《葵花之最》选自...