2017.4.7 java异常处理总结
目录
1.java异常处理的几种错误做法
2.异常处理示例
3.常用异常
4.异常类的继承关系
5.异常处理机制
6.Throw和Throws的区别
7.e.toString(), e.getCause() , e.getMeage(), e.printStackTrace()
1.java异常处理的几种错误做法
http://blog.csdn.net/msyqmsyq/article/details/51504570
(1)捕捉异常却不处理
注意:调用一下printStackTrace算不上“处理异常”。因为调试阶段结束后,printStackTrace就不会再在异常处理模块负重要责任了。
catch(Exception ex) {
ex.printStackTrace();
}
(2)不指定具体的异常,全部用Exception
在catch语句中尽可能指定具体的异常类型,必要时使用多个catch。最后再使用Exception。
try{
//可能发生异常的代码块
}catch(异常类名 e1){
//处理代码
}
catch(异常类 e2){
//处理代码
}
在JSE7中引入了新的语法:这样在该catch代码块中就用能够接受所有的在括号内部的异常类型的对象了。
catch(异常类名 e1 | 异常类名 e2 | 异常类名e3 | ………)
(3)占据资源不释放
充分使用finally关键字,执行清理任务的代码。
(4)不提供异常的详细信息
printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程,但只提供了一些最基本的信息,未能说明实际导致错误的原因,同时也不易解读。因此,在出现异常时,最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一种更适合阅读的方式整理和组织printStackTrace提供的信息。
(5)try/catch 块太庞大
把所有代码而不是可能出现异常的代码,都放入异常处理模块。原因是,不愿意去分析一大块代码中,哪几行可能会出现哪几种异常,因此就容易漏判。
(6)输出数据不完整
如果代码中间抛出了异常,前面执行的代码会不会有影响,后面输出的数据要不要做处理,都是要考虑的。对有些系统来说,数据不完整可能比系统停止带来的损失更大。
比如可以这样处理:在for循环输出数据时,抛出了异常。可以向输出设备写一些信息,声明数据的不完整性;另一种可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一次性输出。
在JavaSE7中已经给出了带资源的try语句用来完成和finally相似的功能,即在try关键字后面带上参数。那么在try块中使用完这个文件流时,就不用使用finally块来将文件流关闭了,程序会自动的将这个文件流关闭,确保文件不被损坏,这样就提供了更加简单的方法来清理资源。
try(InputSTream fis = new FileInputStream (source)){
//可能发生异常的代码
}catch{
//处理代码
}
2.异常处理示例
错误示例:
1 OutputStreamWriter out = ...
2 java.sql.Connection conn = ...
3 try {
4 Statement stat = conn.createStatement();
5 ResultSet rs = stat.executeQuery("select uid, name from user");
7 while (rs.next())
8 {
9 out.println("ID:" + rs.getString("uid")",姓名:" + rs.getString("name"));
11 }
12 conn.close();
13 out.close();
14 }
15 catch(Exception ex) {
17 ex.printStackTrace();
18 }
按照上面的原则修改后:
OutputStreamWriter out = ...
java.sql.Connection conn = ...
try {
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("select uid, name from user");
while (rs.next()){
out.println("ID:" + rs.getString("uid") + ",姓名: " + rs.getString("name"));
}
}
catch(SQLException sqlex){//指定具体的异常 out.println("警告:数据不完整");
throw new ApplicationException("读取数据时出现SQL错误", sqlex); //处理异常或抛出新异常
}
catch(IOException ioex){//指定具体的异常
throw new ApplicationException("写入数据时出现IO错误", ioex); //处理异常或抛出新异常
}
finally{ //释放资源
if (conn != null) {
try {
conn.close();
}
catch(SQLException sqlex2){ //异常导致中断后,做的处理
System.err(this.getClass().getName() + ".mymethod - 不能关闭数据库连接: " + sqlex2.toString());
}
} if (out != null) {
try {
out.close();
}
catch(IOException ioex2){ //异常导致中断后,做的处理
System.err(this.getClass().getName() + ".mymethod - 不能关闭输出文件" + ioex2.toString());
}
}
}
3.常用异常
空指针异常 | NullPointerExption | 类型强制转换异常 | ClassCastException |
数组负下标异常 | NegativeArrayException | 数组下标越界异常 | ArrayIndexOutOfBoundsException |
文件未找到异常 | FileNotFoundException | 输入输出异常 | IOException |
字符串转换为数字异常 | NumberFormatException | NumberFormatException | SQLException |
运行时异常 | RuntimeException | 解析JSON异常 | JSONException |
UnknownSessionException | ExpiredSessionException | ||
插入重复数据异常 |
DuplicateKeyException
|
文件已结束异常 | EOFException |
4.异常类的继承关系
http://blog.csdn.net/hguisu/article/details/6155636
注意:异常分为受检类型和非受检类型。
1 受检类型:继承了Exception但是不继承RuntimeException的子类。
在程序编译期间就会检查,如果发现存在受检异常,那么程序根本就不能执行。不论是用catch还是用throws抛向上一级的catch,该异常必须进行处理。
2 非受检类型:Error,和继承RuntimeException的子类。
在执行期间才会发现异常并中断,在编译阶段不会检查。
比如下面这段代码中,存在两个异常,IOException(受检)和NumberFormatException(非受检)。
去掉IOException,无法通过编译。但是去掉NumberFormatException,可以通过编译。
执行时,如果str无法转换成int,也还是会抛出异常。如果没有catch或者抛向上级的catch,运行阶段(非调试阶段)会造成无提示无处理的程序中断。
public void read() throws IOException, NumberFormatException{
String str;
while(str==reader.readLine()!=null){
int n = Integer.parseInt(str);
System.out.println(n);
}
}
5.异常处理机制
两种方式:catch并处理,或者抛向上级的catch。这里重点讲解抛向上级的catch。
当方法抛出异常列表的异常时,方法将不对这些类型及其子类类型的异常作处理,而抛向调用该方法的方法,由他去处理。
import java.lang.Exception;
public class TestException {
static void pop() throws NegativeArraySizeException {
// 定义方法并抛出NegativeArraySizeException异常
int[] arr = new int[-3]; // 创建数组
} public static void main(String[] args) { // 主方法
try { // try语句处理异常信息
pop(); // 调用pop()方法
} catch (NegativeArraySizeException e) {
System.out.println("pop()方法抛出的异常");// 输出异常信息
}
} }
6.Throw和Throws的区别
throw出现在方法内部,用于抛出异常。
throws出现在方法上,用于声明异常。
如果通过throw抛出了异常(2),并且这个异常是检查异常,则方法名上也必须用throws来声明方法可能会这个异常(1)。
程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块(3)。
package Test;
import java.lang.Exception;
public class TestException {
static int quotient(int x, int y) throws MyException { // 定义方法抛出异常 (1)
if (y < 0) { // 判断参数是否小于0
throw new MyException("除数不能是负数"); // 异常信息 (2)
}
return x/y; // 返回值
}
public static void main(String args[]) { // 主方法
int a =3;
int b =0;
try { // try语句包含可能发生异常的语句
int result = quotient(a, b); // 调用方法quotient()
} catch (MyException e) { // 处理自定义异常 (3)
System.out.println(e.getMessage()); // 输出异常信息
} catch (ArithmeticException e) { // 处理ArithmeticException异常
System.out.println("除数不能为0"); // 输出提示信息
} catch (Exception e) { // 处理其他异常
System.out.println("程序发生了其他的异常"); // 输出提示信息
}
} }
class MyException extends Exception { // 创建自定义异常类
String message; // 定义String类型变量
public MyException(String ErrorMessagr) { // 父类方法
message = ErrorMessagr;
} public String getMessage() { // 覆盖getMessage()方法
return message;
}
}
7. e.toString(), e.getCause() , e.getMeage(), e.printStackTrace()
2017.4.7 e.toString() 与 e.getMessage()的区别
e.toString() : 异常的类型及信息,比如java.lang.ArithmeticException: / by zero
e.getMessage() : 异常的信息, 比如/ by zero
e.getCause() : 异常的原因,如果cause不存在或未知,返回null。
e.printStackTrace() : 异常的跟踪栈。在运行阶段(非调试阶段)没有帮助。
2017.4.7 java异常处理总结的更多相关文章
- 2017.9.5 Java知识点总结
1.*程序的数据操作往往都在内存中操作的,也就是说数据运算都在内存中完成. 2.*什么是变量? --变量就是内存中的一块用来存放数据的存储单元. --变量中的值可变 --我们通过变量名就可以找到内存中 ...
- 札记:Java异常处理
异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...
- java异常处理(父子异常的处理)
我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”.那个时候还不知道子类方法为什么 ...
- Java 异常处理
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用System.out ...
- 《转载》Java异常处理的10个最佳实践
本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...
- JAVA 异常处理机制
主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...
- Java异常处理和设计
在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻 ...
- 深入理解java异常处理机制
异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的 ...
- Java提高篇——Java 异常处理
异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用Syst ...
随机推荐
- win2008服务器信任问题
右键计算机,管理,在第一个页面里面有个安全信息,里面的右边有一个配置IE ESC ,点击他后会出现一个窗口,在那里面选择禁用即可!
- 百度之星复赛T5&&hdu6148
Problem Description 众所周知,度度熊非常喜欢数字. 它最近发明了一种新的数字:Valley Number,像山谷一样的数字. 当一个数字,从左到右依次看过去数字没有出现先递增接着递 ...
- C# 技巧收藏
IIS HTTP Error 500.21 - Internal Server Error 原因:在安装Framework v4.0之后,再启用IIS,导致Framework没有完全安装 解决:开始- ...
- jquery_EasyUI使用细节注意
一.属性key不加双引号,value加双引号,对于url的value,添加‘’单引号:url的访问地址可以使用以下格式: datagrid中的url格式: var datagrid; $(functi ...
- react 如何处理页面加载时无法将获取缓存信息存入全局变量中
最近在做一个权限功能时,发现在读取用户公司ID进行列表查询 时,无法钭读取到缓存中的数据存入页面全局变量中进行加载查询 将问题代码整理出来 将信息存入缓存: let menuList = Helper ...
- UVA 10129 Play on Words (欧拉通路)
本文链接:http://www.cnblogs.com/Ash-ly/p/5398627.html 题意: 输入N(N <= 100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单 ...
- SRM 733 Div 1 爆零记
开场写easy(有预感要FST) 然后medium就卡住了. 我只知道$n$个点的生成树个数是$n^{n-2}$ 接下来直接狗带…… $Problem 250pts$ 水题,直接枚举然后记录答案(我大 ...
- Python的功能模块[4] -> pdb/ipdb -> 实现 Python 的单步调试
pdb / ipdb 模块 / pdb / ipdb Module pdb 和 ipdb 的主要作用是用于 Python 程序的单步调试,Python 的调试可参考链接. 下面是一个简单的使用示例 i ...
- Python的程序结构[8] -> 装饰器/Decorator -> 装饰器浅析
装饰器 / Decorator 目录 关于闭包 装饰器的本质 语法糖 装饰器传入参数 1 关于闭包 / About Closure 装饰器其本质是一个闭包函数,为此首先理解闭包的含义. 闭包(Clos ...
- (转) view视图的放大、缩小、旋转
控件移动,放大,缩小,旋转 1,代码添加控件 例如: /* 1.创建一个控件 2.设置控件的位置,大小 3.设置控件所需要的各个属性 4.添加入父控件 5.添加监听 */ UIButton *btn1 ...