java异常捕获的一点感悟
来源:互联网 发布:淘宝新店铺刷钻 编辑:程序博客网 时间:2024/05/21 12:08
感谢原作者的分享:http://blog.csdn.net/salerzhang/article/details/46581457
下面的代码时Thinking in java中的一个题目。问会输出什么?
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中多态的经典表现。在catch ( Sneeze s )
的时候当然可以捕获到自己抛出来的异常了。
为了证明,子类从本质上无法捕获父类的异常,我们继续做个试验:
try {
throw new Annoyance(); } catch (Sneeze s) { System.out.println("Caught Sneeze"); return; } finally { System.out.println("Hello World!"); }
可以看到,抛出了父类的异常,使用子类catch,这时候可以通过编译,但运行时呢?
[java] view plain copy
Hello World!
Exception in thread “main” com.xq.exceptions.Annoyance
at com.xq.exceptions.Human.main(ExceptionTest.java:14)
可以看到,出了问题了,也就是说,父类throw出来的异常,子类并没有捕获到,继续往下证明:
[java] view plain copy
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!
- java异常捕获的一点感悟
- java异常捕获的一点感悟
- java异常捕获的一点感悟
- java不能捕获的异常
- 五年java人的一点感悟
- 自己初学JAVA的一点感悟
- 自己的java学习一点感悟
- 五年java人的一点感悟
- 关于java程序设计的一点感悟
- 五年java人的一点感悟
- java异常捕获,统一捕获
- java 捕获线程里抛出的异常
- java异常的捕获与抛出原则
- Java异常的捕获和抛出
- java之异常的捕获及处理
- 【think in java】 线程的异常捕获
- java异常的捕获与抛出原则
- JAVA反射捕获自定义的异常
- xlistview网络请求数据以及添加headerview_自动轮播viewpager控件
- UVA 11426 GCD Extreme (II)
- 刷题—— hdu 6181 Two Paths
- C语言-冒泡排序
- Python爬了12万条影评
- java异常捕获的一点感悟
- 网络接收数据缓存机制的分析和改进
- 【Java面试知识点】Java面试知识点汇总
- Android开发培训(05)--创建数据共享
- VirtualBox虚拟机中安装CentOS 7(三)升级CentOS
- #Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别
- java_LeetCode_3--Longest Substring Without Repeating Characters
- Weka中的Correlation based Feature Selection(特征选择)方法简介
- bzoj3527 [Zjoi2014]力