首页 > 代码库 > java不求有功,但求无过—异常处理
java不求有功,但求无过—异常处理
在程序开发中,错误往往有两种。一种是编译时出现的错误,该种错误比较容易发现。另一种是运行时出现的错误,该种错误是开发人员比较头疼的。异常就是一个运行时的错误,例如,除数为0 ,数组越界等。
异常处理,就是我们定义一个代码段(可能出错的代码段)来捕获和处理异常。 这样当异常情况发生时,一个代表该异常的对象会被创建,并在产生异常的方法中被引发。该方法可以选择自己处理异常,也可以抛出该异常,但无论是哪种,最终异常都会被处理。
例如以下的代码:
import java.io.*; public class TestEx{ public static void main(String[] args){ int[] arr= {1,2,3}; System.out.println(arr[2]); try{ System.out.println(2/0); } catch(ArithmeticException ae){ System.out.println("系统正在维护,请稍候!"); ae.printStackTrace();//错误的堆栈信息 } } }
其中 System.out.println(2/0); 则是我们可能出现错误的代码段。Catch 中我们自己定义异常出错的对象,即ae ,一旦出现错误就被初始化。
System.out.println("系统正在维护,请稍候!");
ae.printStackTrace();则是我们对捕获到的异常做出的处理 。
异常的分类 :
如上图,Throwable 是所有异常的父类。 在它之下有两个子类,Error和Exception。
Error: 是指系统错误,例如虚拟机错误,不能被处理。
Exception: 能够处理的异常
RuntimeException:能处理但不处理,例如除数为0 ; 数组下标越界
java异常处理关键字:
Try:意思就是试试它包含的代码段中是否会发生异常。
catch:捕捉的意思,就是有异常发生时进行捕获,并进行相应的处理。
Try 和catch的关系可以是1对1 ,也可以是多对多 ;catch的出现必须有try。
Finally:由于try块中代码段出现异常时,不被执行。但是有时候我们希望无论异常是否发生,某段代码都被执行,例如释放分配中的资源时。
FileInputString in = null; try{ in = new FileInputStream("myfile.txt"); int b; b = in.read(); while (b !=-1){ System.out.println((char) b); b = in.read(); } }catch (FileNotFoundException e){ System.out.println(e.getMessage()); }finally{ try { in.close(); } catch(IOException e){ e.printStackTrace(); } }
getMessage和printStackTrace两个方法用于输出异常信息。 前者用于获得异常信息的字符串,后者可以将方法调用堆栈中的信息打印出来,方便程序员测试。
使用自定义的异常:
private int getTotalRecords(Connection conn)throws SQLException { String sql = "select count(*) from t_user where user_id <> 'root'"; PreparedStatement pstmt = null; ResultSet rs = null; int count = 0; try{ pstmt =conn.prepareStatement(sql); rs = pstmt.executeQuery(); rs.next(); count = rs.getInt(1); }finally{ DBUtil.close(rs); DBUtil.close(pstmt); } return count; } }
说明:定义一个getTotalRecords 的方法,并用throws语句说明可以跑出用户自定义的异常类SQLException。
throws是用来声明一个方法可能抛出的所有异常信息
throw则是指抛出的一个具体的异常类型。
通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。总结:人生道路不可能是那么的一帆风顺的。就好像你开车去旅行的时候,或许你会碰到你车子哪个零部件坏了,引发了Error异常。也或许是前面有大石头挡着你的去路,引发了 Exception异常。遇到这种情况,你有两种选择,一是你自己找个大的木棍把它撬走。二是打电话交给管理道路的人员处理。但是其实你在旅行的道路中,还会遇到很多很多的小石子,这就相当于是RuntimeException,但是我们不可能一个个的去处理这些小石子,因为工作过于繁杂。
总的来说,引入异常处理机制,可以方便我们开发人员调试; 保证程序在出现异常情况下能正确执行,提高程序的健壮性 。