今天看到Thinking in Java中一个关于Exception的例子:
最后看到有一篇总结的比较好的文章, 这里拿来记录下, 文章地址是:http://blog.csdn.net/salerzhang/article/details/46581457  感谢原作者.

 1 class Annoyance extends Exception {}
 2 class Sneeze extends Annoyance {}
 3
 4 class Human {
 5
 6     public static void main(String[] args)
 7         throws Exception {
 8         try {
 9             try {
10                 throw new Sneeze();
11             }
12             catch ( Annoyance a ) {
13                 System.out.println("Caught Annoyance");
14                 throw a;
15             }
16         }
17         catch ( Sneeze s ) {
18             System.out.println("Caught Sneeze");
19             return ;
20         }
21         finally {
22             System.out.println("Hello World!");
23         }
24     }
25 }

请问输出的内容是什么?

先别给出答案,思考一下平时我们写代码的过程中,异常捕获的过程和顺序,比如有这么一段代码:

1 try {
2     throw new FileNotFoundException();
3 } catch (IOException e) {
4
5 }

我们经常能看到这样的代码,也就是使用父类能够捕获子类的异常,当然所有的异常都是继承Exception的,那么为什么不用Exception替换所有具体的异常类呢?这个是要考虑到我们对代码中预期异常的掌握,也就是某些代码会产生什么样的异常,程序员应当心中有数,如果全都用Exception的引用来接收,大家都是稀里糊涂的,如何进行处理也会变得难以着手。但如果在Catch代码块中不打算做任何处理,仅捕获而已,那么这时使用Exception也没什么关系,但正是生产环境下,这样的情况应该不允许存在的,这个看JDK的源码就知道了,捕获异常以后一定要给出提示信息的。

以上的代码证明了,我们可以用父类的引用接受子类的异常对象,那么问题来了,最上面的代码执行结果是什么呢?答案是:

Caught Annoyance
Caught Sneeze
Hello World!

相信第一行和第三行大家都没什么疑问了,关键是第二行,应该出来吗?是不是子类捕获了父类的异常呢?

经过断点的加入,我们发现,尽管

catch ( Annoyance a ) 

这一句使用的是父类的引用,但实际上是子类的对象,这是java中多态的经典表现, 在Annoyance a中捕获的其实是Sneeze的异常。在

catch ( Sneeze s )  

的时候当然可以捕获到自己抛出来的异常了。

为了证明,子类从本质上无法捕获父类的异常,我们继续做个试验:

1 try {
2
3     throw new Annoyance();
4 } catch (Sneeze s) {
5     System.out.println("Caught Sneeze");
6     return;
7 } finally {
8     System.out.println("Hello World!");
9 }

可以看到,抛出了父类的异常,使用子类catch,这时候可以通过编译,但运行时呢?

Hello World!
Exception in thread "main" com.xq.exceptions.Annoyance
at com.xq.exceptions.Human.main(ExceptionTest.java:14)

可以看到,出了问题了,也就是说,父类throw出来的异常,子类并没有捕获到,继续往下证明:

 1 try {
 2
 3     throw new Annoyance();
 4 } catch (Sneeze s) {
 5     System.out.println("Caught Sneeze");
 6     return;
 7 } catch (Exception e) {
 8     System.out.println("Caught Exception");
 9     return;
10 } finally {
11     System.out.println("Hello World!");
12 }

既然子类捕获不了,那就使用Exception,可以看到结果如下:

Caught Exception
Hello World!

看到这样,大家肯定都明白了,不用多说了!

Thinking in java中关于Exception的一道面试题.相关推荐

  1. Java 中处理 Exception 的最佳实践

    Java 中处理 Exception 的最佳实践 在Java中处理异常并不是一个简单的事情.不仅仅初学者很难理解,即使一些有经验的开发者也需要花费很多时间来思考如何处理异常,包括需要处理哪些异常,怎样 ...

  2. java 异常 中英文_史上最全的Java中所有Exception异常中英文对照

    Java中所有Exception异常中英文对照AclNotFoundException, 如果对不存在的访问控制列表进行访问,则会 ArithmeticException 算数异常 ArrayInde ...

  3. 一篇文章搞定java中的垃圾回收机制面试题

    一篇文章搞定java中的垃圾回收机制面试题 任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,在这些对象失去使用的意义的时候,需要释放掉这些内容,保证内存能够提供给新 ...

  4. JAVA中的Exception和Error之间的区别

    请对比Exception和Error,另外,运行时异常与异常有什么区别? 典型回答: Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例可以被抛 ...

  5. java中setconstrations_java程序员认证模拟试题及解析

    java程序员认证模拟试题及解析 天将降大任于是人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为.以下是小编为大家搜索整理的java程序员认证模拟试题及解析,希望能给大家带来帮助!更多精 ...

  6. 在java中在包com.db_java基础试题及其答案 (1)

    java基础试题及其答案 (1) (16页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 1Java试题1)java程序中,main方法的格 ...

  7. java中的exception stack有时候不输出的原因

    有时候,我们在看java错误日志时,只看到一个java.lang.NullPointerException,却没有看到错误的栈,原因是启动时候有一项参数可以选择配置:OmitStackTraceInF ...

  8. Java中获取Exception的详细信息

    当代码出现异常时通常都需要将异常信息写入到日志中,异常信息越详细越有利于问题的排查.而通过的Exception.getMessage()方法只能获得异常的名称而不能获取哪里出现的异常,对于排错意义不大 ...

  9. android和java中常见 Exception

    为什么80%的码农都做不了架构师?>>>    1, 常见的nullpointerexception,在调式程序中最常见是空指针异常了,这个是一般是对象实例化为null, 比如在组件 ...

最新文章

  1. R语言编写自定义函数使用Wilcoxon符号秩检验(Wilcoxon signed rank)实现多分组非参数成对检验(pairwise)、并使用p.adjust函数调整概率值
  2. Airbnb改进部署管道安全性,规范部署顺序
  3. CTFshow 命令执行 web41
  4. 从上往下 流式布局_揭秘做好网站结构优化的4步(下)
  5. SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)...
  6. 使用exe4j将java项目打成exe执行程序
  7. 编译原理:有穷自动机(DFA与NFA)
  8. Python学习-第二天-字符串和常用数据结构
  9. 软件工程期末试题及答案(史上最全)
  10. C语言中,int、char、float、double各占多少字节
  11. 魔兽登录后 服务器那显示不兼容,魔兽世界服务器不兼容什么意思?魔兽世界服务器不兼容解决方法...
  12. exosip2协议栈原理分析以及总结
  13. 树莓派_360wifi2_佳能MP236打印机
  14. AWS Lambda学习2:通过S3事件触发调用Lambda函数,实现缩略图地生成
  15. linux 检测SSD寿命
  16. 从小米智能家居入手,揭秘物联网关键技术
  17. pixi.js淘宝小程序快速上手指南
  18. 轻松升级各路硬件,简约时尚的大容量机箱,TT挑战者H6上手
  19. 远程计算机或设备将不接受连接 解决方案
  20. STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)

热门文章

  1. apache 2.4.12 + tomcat 7.0.61 + jk connectors 1.2.40实现tomcat负载均衡集群
  2. 调侃 -- 刚入职时的单纯
  3. MyBatis 中的 set 元素用法(MyBatis 3.1.1)
  4. CPU值满resmgr:cpu quantum造成的Oracle等待事件解决办法
  5. .NET工程师必须掌握的知识点
  6. 关于对J2EE几点误解和错误认识的澄清
  7. sass的继承,混合宏,占位符的用法总结
  8. 谷歌 Fuchsia 上手体验,将取代Android/win10
  9. iOS progressive Web App (PWA) 技术
  10. 微软公布Win10正式版功能对比表,哪个版本适合你?