目录

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异常处理总结的更多相关文章

  1. 2017.9.5 Java知识点总结

    1.*程序的数据操作往往都在内存中操作的,也就是说数据运算都在内存中完成. 2.*什么是变量? --变量就是内存中的一块用来存放数据的存储单元. --变量中的值可变 --我们通过变量名就可以找到内存中 ...

  2. 札记:Java异常处理

    异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...

  3. java异常处理(父子异常的处理)

    我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”.那个时候还不知道子类方法为什么 ...

  4. Java 异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用System.out ...

  5. 《转载》Java异常处理的10个最佳实践

    本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...

  6. JAVA 异常处理机制

    主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...

  7. Java异常处理和设计

    在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻 ...

  8. 深入理解java异常处理机制

       异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的 ...

  9. Java提高篇——Java 异常处理

    异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用Syst ...

随机推荐

  1. 口红游戏 插口红游戏 h5页面开发

    目前火热的口红机游戏,需要在设备前参与,然后成功后即可赢得口红,作为平台运营者来说还是比较重资产的,目前我们将它搬到了线上.每个人都可以远程玩这样的口红机游戏了.直接在手机微信里试玩,成功后,后台即可 ...

  2. RDM原始设备映射

    在一个存储区域网络(SAN)上,有两种方法为虚拟机配置存储.一种方法是使用VMFS,这是VMware Infrastructure(VI)提供的专有高性能集群文件系统.对大多数企业应用来说,在VMFS ...

  3. Scenes in Cocos2D

    https://www.makeschool.com/docs/?source=mgwu#!/cocos2d/1.0/scenes Scenes in Cocos2D In Cocos2D you h ...

  4. 《Linux命令、编辑器与shell编程》第三版 学习笔记---003 使用multibootusb

    1.下载文件https://codeload.github.com/mbusb/multibootusb-8.9.0.tar.gz,使用命令: tar xvf multibootusb-8.9.0.t ...

  5. 如何在Android 或Linux 下,做Suspend /Resume 的Debug【转】

    转自:http://blog.csdn.net/jacobywu/article/details/24735521 目录(?)[-] Question Answer 加boot 參數 no_conso ...

  6. 用户空间缺页异常pte_handle_fault()分析--(下)--写时复制【转】

    转自:http://blog.csdn.net/vanbreaker/article/details/7955713 版权声明:本文为博主原创文章,未经博主允许不得转载. 在pte_handle_fa ...

  7. 为何url地址不是直接发送到服务器,而是被编码后再发送

    首先,先说一下,关于为何必须将url地址,去编码后,再发送,是因为相关的协议规范:RFC 1738,定义了url地址中不能包含除了0-9的数字,大小写字母(a-zA-Z),短横线’-‘ 之外的字母.换 ...

  8. Linux单机安转Spark

    安装Spark需要先安装jdk及安装Scala. 1. 创建目录 > mkdir  /opt/spark > cd  /opt/spark 2. 解压缩.创建软连接 > tar  z ...

  9. super真的是调用父类吗?

    #!/usr/bin/env python # -*- coding:utf-8 -*- # author:love_cat class A: def __init__(self): print(&q ...

  10. sql多对多探讨

    --用sql语句探讨一对多 多对多关系 /**** 你有3个表  学生表(学生id 学生姓名) 课程表(课程id 课程名) 成绩表 (学生id 课程id 分数) 班级表(班级id 学生id) 这里的班 ...