转载自   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,这时候可以通过编译,但运行时呢?

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!

java异常捕获的一点感悟相关推荐

  1. java 异常捕获抛出_JAVA异常处理捕获与抛出原理解析

    JAVA 异常 当代码运行出现错误导致程序终止运行或出现错误情况的状况,就是异常.异常不是指语法错误,即不属于编译错误,只有运行的程序才会有异常. 这个时候,JAVA 就提供了优秀的处理方法:异常处理 ...

  2. java异常捕获_java之异常捕获

    首先呢我们要知道什么是异常?异常指程序运行过程中出现的非正常现象,例如用户输入错误.除数为零.需要处理的文件不存在.数组下标越界等,英文是:Exception,意思是例外.遇到这些例外情况,或者叫异常 ...

  3. Java异常使用的一点心得

    写这篇博客主要是为了对我的实验四做一个总结,谈一下Java异常类的使用. Java异常的分类 当异常发生的时候,我们可以选择忽略.处理和退出:有些异常是因为程序员的原因,有些这是因为程序运行的物理环境 ...

  4. java异常捕获常使用的语句_要点Java14 捕获异常

    Tutorial 在讲 try/catch 捕获异常语句之前, 先要讲讲 Exceptions 异常. 每次发生错误时都会抛出异常. 示例: ArrayIndexOutOfBounds 数组越界错误异 ...

  5. Java异常捕获论文_一篇文章解决Java异常处理

    前言 与异常相关的内容其实很早就想写了,但由于各种原因(懒)拖到了现在.在大二开学前夜(今天是8.31)完成这篇博客,也算完成了暑期生活的一个小心愿. 以下内容大多总结自<Java核心技术 卷Ⅰ ...

  6. mfc try catch 捕获并显示_“全栈2019”Java异常第十七章:Error该不该被捕获?

    难度 初级 学习时间 30分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 友情提示 本教学属于系列教学,内容具有连贯性,本章使用到的内 ...

  7. 我可以在同一个catch子句中捕获多个Java异常吗?

    本文翻译自:Can I catch multiple Java exceptions in the same catch clause? In Java, I want to do something ...

  8. Java多层的异常捕获

    Java多层的异常捕获 参考文章: (1)Java多层的异常捕获 (2)https://www.cnblogs.com/somedayLi/p/7847136.html 备忘一下.

  9. java 异常的捕获及处理

    java 异常的捕获及处理 参考文章: (1)java 异常的捕获及处理 (2)https://www.cnblogs.com/tigerBoy/p/6286504.html 备忘一下.

最新文章

  1. pip install 时报错 ERROR: Could not install packages due to an EnvironmentError: [WinError 5]
  2. JavaScript学习笔记——对象知识点
  3. 【NOI2011】兔兔与蛋蛋的游戏【二分图博弈】
  4. 几个国内外远程工作平台
  5. mysql 自动安装脚本_mysql 5.7自动安装脚本
  6. 运行测试类(Test报错) Execution failed for task ‘:test‘.
  7. 安卓 实现一个简单的计算器
  8. python绘制箱线图-python绘制箱线图
  9. 往服务器复制文件提示拒绝访问,Win10系统复制文件提示目标文件夹被拒绝访问的解决方法...
  10. 水瓶清洗污水及生活废水处理设备工艺流程图
  11. 【Maya开发基础】全局缩放补偿
  12. 苹果手机升级13无法开机_苹果手机更新时突然断电,手机无法开机,为什么?...
  13. 全网页都变灰了,这是怎么实现的?
  14. 游戏服务器主程白皮书-概述
  15. 其实最有可能的是阿隆索撞舒马赫
  16. 爱因斯坦为什么那么牛,看看大家怎么说?
  17. 智能建筑中高低压配电设备集成监控和管理系统应用分析-李亚俊
  18. 回撤率 python_求问怎么用python求夏普比率和最大回撤率呢
  19. 跟踪上传进度PHP和JavaScript
  20. 蓝桥杯 奥运会开幕式

热门文章

  1. 临界表储存图的数据(思路+详解+图示)
  2. [mybatis]映射文件_select_resultMap_关联查询_association分步查询延迟加载
  3. [PAT乙级]1022 D进制的A+B
  4. [剑指offer]面试题41:和为s的两个数字VS和为s的连续正数序列
  5. LeetCode 61旋转链表-中等
  6. ember.js mysql_用AWS部署ember.jspadrino应用系列之一
  7. Cookie和Session的作用和工作原理
  8. Java ArrayList的实现原理详解
  9. string(STL)
  10. 【CTSC2010】珠宝商【后缀自动机】【点分治】【根号分治】