Thinking in java中关于Exception的一道面试题.
今天看到Thinking in Java中一个关于Exception的例子:
最后看到有一篇总结的比较好的文章, 这里拿来记录下, 文章地址是:http://blog.csdn.net/salerzhang/article/details/46581457  感谢原作者.
 class Annoyance extends Exception {}
 class Sneeze extends Annoyance {}
 class Human {
     public static void main(String[] args)
         throws Exception {
         try {
             try {
                 throw new Sneeze();
             }
             catch ( Annoyance a ) {
                 System.out.println("Caught Annoyance");
                 throw a;
             }
         }
         catch ( Sneeze s ) {
             System.out.println("Caught Sneeze");
             return ;
         }
         finally {
             System.out.println("Hello World!");
         }
     }
 }
请问输出的内容是什么?
先别给出答案,思考一下平时我们写代码的过程中,异常捕获的过程和顺序,比如有这么一段代码:
 try {
     throw new FileNotFoundException();
 } catch (IOException e) {
 }
我们经常能看到这样的代码,也就是使用父类能够捕获子类的异常,当然所有的异常都是继承Exception的,那么为什么不用Exception替换所有具体的异常类呢?这个是要考虑到我们对代码中预期异常的掌握,也就是某些代码会产生什么样的异常,程序员应当心中有数,如果全都用Exception的引用来接收,大家都是稀里糊涂的,如何进行处理也会变得难以着手。但如果在Catch代码块中不打算做任何处理,仅捕获而已,那么这时使用Exception也没什么关系,但正是生产环境下,这样的情况应该不允许存在的,这个看JDK的源码就知道了,捕获异常以后一定要给出提示信息的。
以上的代码证明了,我们可以用父类的引用接受子类的异常对象,那么问题来了,最上面的代码执行结果是什么呢?答案是:
Caught Annoyance
Caught Sneeze
Hello World!
相信第一行和第三行大家都没什么疑问了,关键是第二行,应该出来吗?是不是子类捕获了父类的异常呢?
经过断点的加入,我们发现,尽管
catch ( Annoyance a )
这一句使用的是父类的引用,但实际上是子类的对象,这是java中多态的经典表现, 在Annoyance a中捕获的其实是Sneeze的异常。在
catch ( Sneeze s )
的时候当然可以捕获到自己抛出来的异常了。
为了证明,子类从本质上无法捕获父类的异常,我们继续做个试验:
 try {
     throw new Annoyance();
 } catch (Sneeze s) {
     System.out.println("Caught Sneeze");
     return;
 } finally {
     System.out.println("Hello World!");
 }
可以看到,抛出了父类的异常,使用子类catch,这时候可以通过编译,但运行时呢?
Hello World!
Exception in thread "main" com.xq.exceptions.Annoyance
at com.xq.exceptions.Human.main(ExceptionTest.java:14)
可以看到,出了问题了,也就是说,父类throw出来的异常,子类并没有捕获到,继续往下证明:
 try {
     throw new Annoyance();
 } catch (Sneeze s) {
     System.out.println("Caught Sneeze");
     return;
 } catch (Exception e) {
     System.out.println("Caught Exception");
     return;
 } finally {
     System.out.println("Hello World!");
 }
既然子类捕获不了,那就使用Exception,可以看到结果如下:
Caught Exception
Hello World!
看到这样,大家肯定都明白了,不用多说了!
Thinking in java中关于Exception的一道面试题.的更多相关文章
- Java中有关构造函数的一道笔试题解析
		Java中有关构造函数的一道笔试题解析 1.详细题目例如以下 下列说法正确的有() A. class中的constructor不可省略 B. constructor必须与class同名,但方法不能与c ... 
- java 中的Exception RuntimeException 区别
		在java的异常类体系中: 1.Error和RuntimeException是非检查型异常,其他的都是检查型异常; 2.所有方法都可以在不声明throws的情况下抛出RuntimeException及 ... 
- java中的exception stack有时候不输出的原因(转)
		原文 https://www.cnblogs.com/lemonlotus/p/5650687.html 有时候,我们在看java错误日志时,只看到一个java.lang.NullPointerEx ... 
- java中的exception stack有时候不输出的原因
		有时候,我们在看java错误日志时,只看到一个java.lang.NullPointerException,却没有看到错误的栈,原因是启动时候有一项参数可以选择配置:OmitStackTraceInF ... 
- Java中的Exception
		Caused by: java.lang.IllegalArgumentException: The servlets named [XXX] and [YYY] are both mapped to ... 
- java中难度大一点的面试题
		1.请大概描述一下Vector和ArrayList的区别,Hashtable和HashMap的区别.(5) (1)Vector和ArrayList的异同 实现原理,功能相同,可以互用 主要区别: Ve ... 
- 【PHP】 foreach循环中变量引用的一道面试题
		$a = array('a','b','c'); foreach($a as &$v){} foreach($a as $v){ } var_dump($a); 现在.不要打开浏览器,猜测一下 ... 
- Java中关于位运算的面试题
		位运算的效率是最高的,因为位位运算是直接对二进制进行操作 位运算只能应用于整型和char类型(char类型可以看做是特殊的无符号的整形) 面试题: a: 判断一个数是否是奇数 a & 1 == ... 
- Java中String类的常见面试题
		1. 判断定义为String类型的s1和s2是否相等 String s1 = "ab"; String s2 = "abc"; String s3 = s1 + ... 
随机推荐
- 上传App Store成功后,无法构建版本解决方法
			最近iOS10出来了,Xcode也跟着升级到了8,想着App做个更新,于是修改好了代码打算上传新包,无奈总是发现构建不了新版本.这种情况是因为苹果更重视用户的隐私,知道原因就能想到对策了,就是在pli ... 
- ubuntu搜不到wifi信号
			很多人刚刚装完ubuntu发现搜不到wifi信号,输入命令查看配置发现没有无线网卡驱动, 其实ubuntu是可以自动识别无线网卡自动安装驱动的,此时只需输入命令更新一下即可, 连上有线网,在终端输入此 ... 
- 在app中打开appStore中其他app
			var str = "https://itunes.apple.com/cn/app/zhang-jiange-hao-tou-zi-ke/id402382976?mt=8"//这 ... 
- mysql远程快速导出csv格式数据工具
			如需转载,请经本人同意. 之前本人曾经写过一个使用 select ....into outfile原理导出数据的脚本,但该脚本值适用于本地快速导出,并不支持远程服务,故又编写了下面这个支持远程导出的脚 ... 
- Win8.1下FreeImage.lib库的配置和简单使用(转)
			转自http://www.codeweblog.com/win8-1下freeimage-lib库的配置和简单使用/ 首先,你可以从这里获取FreeImage的完整库文件(访问密码 9a5e). 配置 ... 
- 原声JavaScript实现滚动条·改1
			修正了获取元素相对视口左距离的逻辑问题(之前的函数实际获取的是相对于页面左距离).去除了调试时忘记删除的mouseleave事件.将创建滚动条的功能单独列为一个函数. 添加了鼠标点在滚动条什么位置,就 ... 
- [UCSD白板题] Huge Fibonacci Number modulo m
			Problem Introduction The Fibonacci numbers are defined as follows: \(F_0=0\), \(F_1=1\),and \(F_i=F_ ... 
- HTML5中id可以用数字开头,但在css中不能正常使用
			昨晚在看<响应式Web设计:html5和css3实战>时,书中提到“HTML5中的ID指可以用数字开头”.这个还真不知道,于是测试了一下,发现了问题. 在H5描述中是这样说的: 在css样 ... 
- 我的Sharepoint表单使用
			采用客户端验证和后台异步验证. 
- 页面加载完成后加载多个函数的js完美解决方案
			function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') ... 
