Java中允许对异常进行再次抛出,以提交给上一层进行处理,最为明显的例子为Java的常规异常。

常规异常:有Java所定义的异常,不需要异常声明,在未被try-catch的情况下,会被默认上报到main()方法。

Example:

public class TestException {TestException(int i) throws ExceptionA,ExceptionB{int a[]={0,}; a[1]=1;}
}

当从main()方法中调用TestException类的构造函数的时候,会得到以下的异常提示,从中可以看出异常的冒泡机制(这是一个栈信息)。

异常的冒泡上传机制:当一个异常对象产生了以后,其会按照调用层次(一般是方法的调用层次)进行冒泡,直到被try-catch处理,或上报至main()方法,有编译器进行提示。

Example:

firstThrow()提示错误的原因为, firstThrow()的函数声明中包括了MyException的异常声明,而secondThrow()中调用了firstThrow()却未对可能抛出的异常对象提供任何处理方案,这是编译器所不能允许发生的事情。(这也是为了保证底层异常对象在冒泡过程中,能得到合适的处理和重视!)

注意此截图中,MyEclipse提供了两种方式帮助fix这个程序这两种方式常用的异常应对手段

1、本方法不给予处理,将异常上报给上一层。

 1 public class TestExceptionChain {
 2     void firstThrow() throws MyException
 3     {
 4         print("Oringinally creat a MyException and throw it out");
 5         throw new MyException();
 6
 7     }
 8     void secondThrow() throws MyException
 9     {
10         firstThrow();
11     }
12     TestExceptionChain() throws MyException{
13         secondThrow();
14     }
15 }

 1 public static void main(String[] args) {
 2         try{
 3
 4             TestExceptionChain testExceptionChain=new TestExceptionChain();
 5         }
 6         catch(MyException e)
 7         {
 8             e.printStackTrace();
 9             print("Catch a my exception!");
10         }
11
12     }

控制台的输出为:

从异常栈的记录信息可以发现,与代码相对应的异常抛出机制和次序:

firstThrow()产生MyException对象->异常冒泡至调用其的secondThrow()->异常冒泡至调用secondThrow()的TestExceptionChain的构造方法->冒泡至printtry的main()方法。

注意到:异常对象一直被抛出,直至在printtry的mian()方法中被try-catch捕获!

 

2、try-catch方式,捕捉上报的异常,而后进行相应处理或抛出另一异常。

2、1捕获异常后,进行相应处理。

Example:

 1 public class TestExceptionChain {
 2     void firstThrow() throws MyException
 3     {
 4         print("Oringinally creat a MyException and throw it out");
 5         throw new MyException();
 6     }
 7     void secondThrow()
 8     {
 9         try
10         {
11         firstThrow();
12         }
13         catch (MyException e)
14         {
15             print("I have just caught a MyExcepton,but i want to do nothing for it");
16             e.printStackTrace();
17         }
18     }
19     TestExceptionChain(){
20         secondThrow();
21     }

从图中可以发现,异常在secondThrow() 中被try-catch模块捕获,并执行了相应的处理操作,所以其函数声明中无需添加异常声明,异常不会被上报

故mian()方法被改写成了以下的代码:

1 TestExceptionChain testExceptionChain=new TestExceptionChain();

注意此处异常栈的信息,表示的是异常产生的层次信息,并非异常信息的上报层次,因为其已经在secondThorow()中被捕获处理。

 

2.2 捕获异常后,抛出另一个异常。

Example:

 1 public class TestExceptionChain {
 2     void firstThrow() throws MyException
 3     {
 4         print("Oringinally creat a MyException and throw it out");
 5         throw new MyException();
 6     }
 7     void secondThrow() throws YouException
 8     {
 9         try
10         {
11         firstThrow();
12         }
13         catch (MyException e)
14         {
15             print("I have just caught a MyExcepton,but i want to create a YouException and throw it out");
16             e.printStackTrace();
17             throw new YouException();
18         }
19     }
20     TestExceptionChain() throws YouException{
21         secondThrow();
22     }
23 }
24 class MyException extends Exception{}
25 class YouException extends Exception{}

从异常栈信息中可以发现,新抛出的YouException对象是从secondThrow()中开始的。

 

*Java中还提供了fillInStackTrace()方法,用于对捕获的异常的栈信息进行重写。

Example:

 1 try{
 2
 3             TestExceptionChain testExceptionChain=new TestExceptionChain();
 4         }
 5         catch(YouException e)
 6         {
 7             print("Catch a YouException!");
 8             e.fillInStackTrace();
 9             e.printStackTrace();
10
11         }

 由于使用了fillInstack()方法,关于YouException的异常信息被重写,从其被从写处重新记录!

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/airwindow/archive/2012/06/26/2564123.html

Java中的异常栈轨迹和异常链相关推荐

  1. 了解Java中的检查与未检查异常

    约书亚·布洛赫(Joshua Bloch)在< 有效的Java >中说 将检查的异常用于可恢复的条件,将运行时异常用于编程错误(第二版中的项目58) 让我们看看我是否正确理解了这一点. 这 ...

  2. JAVA中堆和栈的区别和联系

    一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存. 堆:主要用于储存实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. 栈 ...

  3. Java虚拟机:Java中堆和栈的详细区别

    一.Java中内存分配策略: 在比较堆和栈的区别之前,我们先了解下Java的内存分配策略,按照编译原理的观点,程序运行时的内存分配有三种策略,分别是:静态的,栈式的,和堆式的. (1)静态存储分配:是 ...

  4. java堆和栈 常量池_GitHub - han-guang-xue/difference-of-stack-heap-pool: Java中堆、栈和常量池的区别...

    Java中堆.栈和常量池的区别 栈 堆 常量池的概念 首先我们先了解一下概念,Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 栈内存 存放基本类型的变量数据和对象类型的引用(请注意存放的是引 ...

  5. Java中堆、栈、常量池等概念解析

    Java中堆.栈.常量池等概念解析 程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据: (1) 寄存器.这是最快的保存区域,因为它位于和其他所有 ...

  6. Java中已检查和未检查的异常

    Java有两种类型的异常-已检查和未检查. 简而言之,选中的是指开发人员可以从异常中合理恢复的情况,而未选中的异常是无法处理的编程错误. 本文介绍了何时使用哪种. 但这不是那么简单–受检查的异常使代码 ...

  7. java中堆和栈的区别!!!!

    Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放.堆是由垃圾回 ...

  8. 面试:说说Java 中堆和栈的区别?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | nnngu 来源 | cnblogs.com/ ...

  9. JAVA中堆和栈的区别

    堆:(对象) 引用类型的变量,其内存分配在堆上或者常量池(字符串常量.基本数据类型常量),需要通过new等方式来创建. 堆内存主要作用是存放运行时创建(new)的对象. (主要用于存放对象,存取速度慢 ...

最新文章

  1. 2022-2028年小型风电产业投资及前景预测报告
  2. POJ - 1330 Nearest Common Ancestors tanjan_LCA
  3. linux虚拟用户的配置
  4. jQuery之防止冒泡事件
  5. java中gc是啥_java的gc是什么
  6. 电脑服务器注册表,电脑注册表怎么清理 服务器安全狗清理注册表教程
  7. STM32启动文件代码解析
  8. 2017-2018-1 20155213 《信息安全系统设计基础》第十一周学习总结
  9. Java-旋转字符串
  10. 小程序布局中class='container'的bug
  11. CREATE TABLE TEST_A AS SELECT * FROM TEST_B
  12. FPGA跨时钟域打两拍和三拍问题
  13. 2012年8月24日
  14. 2020年小米高级 PHP 工程师面试题
  15. Mac关闭“屏幕截图”和“清倒废纸篓”音效
  16. mac鼠标滚轮 触控板_如何在Mac上为滚轮而不是触摸板禁用自然滚动
  17. 光合作用9月五星推荐图书
  18. superset:自定义标签乱码解决
  19. -moz、-ms、-webkit浏览器私有前缀详解,作用、出处
  20. android开发笔记之属性动画

热门文章

  1. Oracle ORA-07445 [evaopn3()+384] 错误 分析
  2. linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )
  3. xshell十大技巧
  4. android自定义表盘部件,Android自定义view仿支付宝芝麻信用表盘
  5. 华为鸿蒙2.0什么核心,鸿蒙系统2.0:安卓最核心部分基本已去除,将带来全新的体验...
  6. android usb弹窗权限r,Android USB权限对话框永远不会出现
  7. mysql+cast+0x_mysql cast与convert 函数的用法
  8. 查看mysql 中建立的表空间_mysql 表空间及索引的查看
  9. 多家防火墙设备存在信息泄露漏洞
  10. linux 查看libusb版本,linux / libusb获取usb设备路径