Atitit java的异常exception 结构Throwable类
Atitit java的异常exception 结构Throwable类
1.1. Throwable类 2、StackTrace栈轨迹1
1.3. 4、SuppressedException被屏蔽的异常2
1.1. Throwable类 2、StackTrace栈轨迹
栈轨迹记录了程序从开始到异常抛出点所调用的方法。通过StackTraceElement[] getStackTrace()可以获得一个StackTraceElement的数组,每个StackTraceElement记录一个栈帧,0号元素表示栈顶,由栈的FILO规则可知0号元素表示最后调用的方法,而栈底则表示第一个调用的方法,一般就是main了。
Throwable提供了一个打印栈轨迹的方法void printStackTrace(),输出到System.err,如要输出到其它地方,可调用printStackTrace(PrintStream s)或void printStackTrace(PrintWriter s)。
重抛异常时,异常对象的所有信息保持不变,所以printStackTrace()西那是的将是原来异常抛出点的调用栈信息,而非重新抛出点的信息。要想更新这个信息,可以调用Throwable fillInStackTrace(),该函数将产生一个新的Throwable对象,它是通过把当前的调用栈信息填入原来那个异常对象而建立的。调用fillInStackTrace()的那一行成了异常的新发生地。不过fillInStackTrace()要生效必须保证StackTrace是可写的,这个可通过调用构造器Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)实现。
1.2. 3、cause因由
当我们在捕获到一个异常后想抛出另一个异常,并且希望把原始的异常信息保存下来,就可以调用构造器把原始的异常对象保存到新的Throwable的cause中,如Throwable(String message, Throwable cause)。或者构造新的异常对象时没有初始化cause,则可以调用Throwable initCause(Throwable cause),这个方法最多只能调用一次,也就是说cause一旦初始化了就不能再设置。 可以把cause看成是链表元素中指向上一个元素的引用,所以最终将形成一条异常链。异常链的信息会在printStackTrace()中打印出来。
1.3. 4、SuppressedException被屏蔽的异常
保存被屏蔽的异常,可通过Throwable[] getSuppressed()获得。添加的话用addSuppressed(Throwable exception),这个函数一般是在try-with-resources语句中由自动调用的。
1.4. try-with-resources语句
从 Java 7 build 105 版本开始,Java 7 的编译器和运行环境支持新的 try-with-resources 语句,称为 ARM 块(Automatic Resource Management) ,自动资源管理。使用如下:
try (InputStream fis = new FileInputStream(source);
OutputStream fos = new FileOutputStream(target)){
}
catch (Exception e) {
e.printStackTrace();
}
}
在使用try-with-resources语句的时候,异常可能发生在try语句中,也可能发生在释放资源时。如果资源初始化时或try语句中出现异常,而释放资源的操作正常执行,try语句中的异常会被抛出;如果try语句和释放资源都出现了异常,那么最终抛出的异常是try语句中出现的异常,在释放资源时出现的异常会作为被抑制的异常添加进去,即通过Throwable.addSuppressed方法来实现。
能够被try语句所管理的资源需要满足一个条件,那就是其Java类要实现java.lang.AutoCloseable接口,否则会出现编译错误。当需要释放资源的时候,该接口的close方法会被自动调用。Java类库中已有不少接口或类继承或实现了这个接口,使得它们可以用在try语句中。在这些已有的常见接口或类中,最常用的就是与I/O操作和数据库相关的接口。与I/O相关的java.io.Closeable继承了AutoCloseable,而与数据库相关的java.sql.Connection、java.sql.ResultSet和java.sql.Statement也继承了该接口。如果希望自己开发的类也能利用try语句的自动化资源管理,只需要实现AutoCloseable接口即可。代码清单1-19给出了一个自定义资源的使用示例,在close方法中可以添加所需要的资源释放逻辑。
1.5. 八、异常说明的继承。
前面说过异常说明是方法声明的一部分,那么如果派生类想覆盖基类的某个包含异常说明的方法,需要如何处理呢?这个问题要分为两种情况,一种是对于构造函数,另外一种是对于成员方法。
对于覆盖成员方法的情况,为了满足多态的情况,我们必须保证处理基类方法产生异常的程序能处理派生类方法所能产生的异常(因为我们可以把派生类向上转型为基类),这就要求派生类方法的异常说明中的异常必须包含于基类方法的异常说中。
对于构造函数,我们调用的时候对象还没有生成,所以不能将其赋予一个基类引用,不存在多态的情况,所以派生类构造函数的异常说明中可以包含基类构造函数的异常说明中没有的异常类型。另一方面,由于派生类的构造函数会调用基类的构造函数,会产生基类构造函数能产生的异常,所以派生类构造函数的异常说明应包含基类构造函数的异常说明中的异常类型。这跟成员方面的情况刚好相反。
Java异常处理机制_supernan_新浪博客.html
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
Atiend
Atitit java的异常exception 结构Throwable类的更多相关文章
- Java常见异常:Exception in thread "main" java.lang.NoClassDefFoundError
在某一路径下执行编译好的class文件出错. 异常如下: E:\liwy>java Test98 Exception in thread "main" java.lang.N ...
- java开发异常Exception集锦
背景:整理开发过程中的异常问题 java.lang.Exception: No tests found matching 一般出现在新导入的工程中.在sts中通过open project的方式导入工程 ...
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- 《java中异常和错误》
异常和错误的区别. 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发 ...
- 异常Exception
try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看 ...
- java之异常详解
一.什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域正常运行的情况,称之为异常. 二.异常体系 Java把异常当作对象来处理,并定义一个基类java. ...
- 《Java基础——异常的捕获与抛出》
Java基础--异常的捕获与抛出 ' 前言: Error类(错误)和Exception类(异常)是Throwable类的子类. 异常分为CheckedException类(编译时异常)和Ru ...
- java代码异常,水位异常的捕获
总: 异常的产生!!!!异常如何实现,继承~~~ package com.b; //我不懂为什么这里的异常一定要来自于父类.子类.去继承它.因为Exception是Throwable类的子类异常类.而 ...
- 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception
异常体系结构 概念 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类. 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Erro ...
随机推荐
- Struts2之提交对象数组至后台
struts2中有许多很好的特性,比如在设置好getter和setter方法后,加上前端的匹配设置,后台即可自动将前端输入的数据转换为后台的相应的对象. 如现在传入一个Person类的对象,其中Per ...
- linux下rm -r误删NTFS文件恢复方法
一时疏忽,手一抖,把整个挂载的F盘删了一半!顿时傻眼!! 被删的F盘是Windows下NTFS分区,在Ubuntu12.04中挂载了F盘,使用rm命令时粗心大意,误删了一半的数据. 血的教训告诉我们, ...
- Java printf
- Angular JS将数据显示为两列(html)
(数据为Array数组)使用AngularJS中ng-show="{{}}",其将数据按行分为奇数行和偶数行,$even是判断是否为奇数行[如果是则为true,不是则为false] ...
- hdu 3397 Sequence operation(线段树:区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给你一个长度为n的0,1序列,支持下列五种操作, 操作0(0 a b):将a到b这个区间的 ...
- KIWI Syslog配置
日志服务器Kiwi+Syslogd+8.3.7破解版 Window收集服务器日志evtsys_exe_32 默认地,kiwi使用UDP 514端口接收日志数据,安装成功后即可接收日志 使用命令nets ...
- MOTION-MATCHING IN UBISOFT’S FOR HONOR翻译
http://www.gameanim.com/2016/05/03/motion-matching-ubisofts-honor/ Introducing For Honor with a vide ...
- thinkphp学习笔记(一)
一.入门与安装 1.进入C:\Windows\System32\drivers\etc的hosts文件中增加127.0.0.1 www.tp5.com 即访问这个域名就相当于访问127.0.0.1 2 ...
- shell学习
set -x 进入调试模式,会把每一个命令实际执行的命令打印出来,也就是会把一些参数扩展后的样子打印出来. set +x 退出调试模式自定义变量:x=7,y=8echo `expr $x + $y` ...
- Linux下安装mysql数据库
l 检查是否已安装mysql的相关包 [root@localhost ~]# rpm -qa|grep -i mysql MySQL-server-5.6.19-1.el6.x86_64 MySQL- ...