`
dandy
  • 浏览: 67224 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

极端不可思议

    博客分类:
  • java
F# 
阅读更多
出自《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,但是你第一次看到它们时,可能会有点吃惊。
3
0
分享到:
评论

相关推荐

    Java解惑(谜题)CHM中英文双版本

    谜题37:极端不可思议 谜题38:不受欢迎的宾客 谜题39:您好,再见 谜题40:不情愿的构造器 谜题41:域和流 谜题42:异常为循环而抛 谜题43:异常地危险 谜题44:切掉类 谜题45:令人疲惫不堪的测验 Java...

    Java异常的几个谜题_动力节点Java学院整理

    谜题2:极端不可思议 这个谜题包含三个不同的程序: 1. 第一个程序`Arcane1`:在这里,`try`块试图打印“Hello world”,并捕获`IOException`。通常,`System.out.println`不会抛出`IOException`,因此捕获异常的...

    初中语文文摘社会不可思议的宇宙真相

    【标题】和【描述】提及的是“不可思议的宇宙真相”,主要涵盖了关于宇宙中的一些奇特现象和事实,包括冥王星的冰层特性、行星的自转与公转规律、太空环境对人体的影响以及月亮与地球之间的潮汐作用。下面将详细阐述...

    小学英语英语故事童话故事TheMostIncredibleThing最难使人相信的事情

    同时,故事中的竞争和奖励机制也反映了社会中的一些价值观,教导孩子们要有目标,勇于追求,并且在追求过程中要保持理智,避免极端的行为。 总的来说,"The Most Incredible Thing"是一部寓教于乐的英语童话,它...

    七年级下学期语文同步 期中 期末试卷28套【新课标人教版】10精选.doc

    2. **词语填充**:此部分锻炼学生的词汇理解和应用能力,例如“冻饿之虞”表示因寒冷和饥饿带来的困境,“不可思议”形容难以想象或理解。 3. **文学常识**:要求学生了解著名作家及其作品,如《伟大的悲剧》的作者...

    《鸟奴》读后感.docx

    在书中,鹩哥老毛和徐娘因为连续失去鸟蛋,被蛇雕的天敌威胁,选择了一条看似不可思议的道路——成为蛇雕的“奴隶”。它们帮助蛇雕清理巢穴,以换取蛇雕的保护,这是一种自然界的共生关系,但并非常见的共栖或互利...

    苔藓笔记_csdn

    苔藓可以长时间保持湿润和柔软,即便在极端的环境中也不会腐烂。 苔藓在时间的维度中展现出了另一种存在形式,即“苔藓时间”。这种时间概念并不是一般意义上的时间流逝,而是一种静态的、存在于想象深处的存在。它...

    用语言表达的文言文.doc

    - **荒谬绝伦**:形容事情极端荒谬,无可比拟。常用来形容那些极其荒唐、不可思议的情况。 ### 知识点二:语病的识别与修正 #### 1. 句子成分的完整性和逻辑性 - 在分析句子是否有语病时,需要注意句子的主谓宾...

    学年八年级语文第二次月考试题及答案精选.doc

    5. **语病判断**:试题测试了学生对语病的识别,如"能否作出准确预报"与"对减小极端天气危害起着巨大作用"之间存在两面对一面的问题,"改善杭州城市知名度、美誉度和竞争力"中"改善"应改为"提升"。 6. **标点符号...

    语言分析高分秘诀

    10. 不可思议:现在多用来形容事情难以想象和理解。在2009年浙江和2010年9月联考中,分别作为正确和干扰选项。 11. 不可一世:形容极端的自大和傲慢。在2008年上海和2009年北京社招考试中,此成语均为干扰选项。 ...

    一字之差意思相去甚远的成语归纳.doc

    - **无所不至**可以指到任何地方,也可以形容做事极端,甚至包括坏事。 6. **一蹴而就**与**一挥而就**: - **一蹴而就**比喻事情轻而易举就能完成,常用于描述成功的快速和容易。 - **一挥而就**通常用于形容...

    各类成语分类整理打印版.doc

    - **不名一钱**:形容极端贫穷。 - **不值一钱**:形容完全没有价值。 10. **不赞一词 VS 不容置喙** - **不赞一词**:指文章写得好,无需修改。 - **不容置喙**:不允许别人插嘴或发表意见。 11. **改弦更张 ...

    鲁滨孙造船PPT课件5

    在造船过程中,鲁滨孙经历了无数次的挫折,但他并未放弃,而是以微不足道的工具和材料,创造出不可思议的结果,体现出他的吃苦耐劳和坚韧不拔。 “一言难尽”这个词形象地描绘了鲁滨孙在造船过程中所经历的艰辛。这...

    江苏省泰兴市第三高级中学高中语文优秀作文阳光素材1

    2. **适应环境**:依米花在沙漠中生长,适应了极端条件,这提示我们在IT领域,无论是开发者还是项目经理,都需要具备适应新技术、新环境的能力。例如,从传统编程转向云计算,或是从桌面应用转向移动应用,都需要...

    2015语文S版语文六上《鲁滨孙造船》ppt课件2

    - **不可思议**:无法理解或想象,形容事情非常神奇或难以置信。 - **荒谬**:极端不合理或错误的行为或想法。 ### 5. 课文细节 - 通过鲁滨孙的决心和行动,展现了一个勇敢面对挑战的人物形象。例如,他尝试修理...

    2015春冀教版语文六下《葵花之最》ppt课件

    此篇章通过描述在极端环境下葵花的成长过程,展现了生命力的强大与坚韧,同时也借葵花的形象赞美了边防战士们的坚强意志与无私奉献。 ### 重点知识点解析 #### 一、文本背景介绍 - **故事背景**:《葵花之最》选自...

    21--伟大的悲剧——学生学习课件

    - **不可思议**:不可想象,不能理解。 - **精疲力竭**:形容极度疲乏。 - **毛骨悚然**:形容十分恐惧。 ### 五、课文结构分析 #### 1. 快速默读全文,概括全文内容 - **时间**:1912年 - **人物**:英国探险队...

    ZJU_ACM_All_Anwer 搞编程的都知道的浙江大学A 题库.本书 集了所有经 Z 题解集,集合并附 Mathimaticsumerical algorithms 数值算法

    ZJU_Main 主页 下一页 ZJU 题型分类 文演整理版 2008-3-23 数论: 1007 Numerical Summation of a Series 简单题,还是蛮有意思的 1045 HangOver 简单题 ... 1049 I Think I Need a Houseboat 简单题 ...

    浙江大学ACM题解/ZJU 题型分类

    ZJU 题型分类 ZJU_Main 主页 下一页 ZJU 题型分类 文演整理版 2008-3-23 数论: 1007 Numerical Summation of a Series 简单题,还是蛮有意思的 ... 1049 I Think I Need a Houseboat 简单题 ...

Global site tag (gtag.js) - Google Analytics