第6章 异常的捕获及处理 6.1 异常简介 6.2 异常类的继承结构 6.3 异常处理机制 6.4 异常处理 6.5 本章小结
6.1 异常简介 在程序运行过程中,可能会遇到一些非正常的状况,这种非正常状况对程序来说是一种异常 例如:除以零、数组越界、试图打开一个根本不存在的文件等。 后果:如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失。所以在程序的设计中必须考虑到各种异常的发生,并做好相应的处理。 一个好的程序,整体的1/3是在处理要完成的真正任务,而2/3是在处理异常,这样的程序才是最强壮的。
6.2 异常类的继承结构 Object Throwable RuntimeException …… Error Exception IOException 异常类 查阅API文档
6.3 异常处理机制 两种处理异常的机制 ①捕获异常 ②抛出异常 异常类对象的产生:程序产生异常时,系统(JVM)会自动实例化一个异常类的对象,对象中保存了具体的异常描述信息。 try——catch——finally模型 throw 、throws
6.4 异常处理 定义类 创建对象 初始化 SUN 程序员 异常类 JVM 处理异常时编程人员做什么? ①给异常类对象起名字 ②抓它 Java库类中的类 SUN 程序员 用户创建的类 异常类 JVM 出错的方法 处理异常时编程人员做什么? ①给异常类对象起名字 ②抓它 ③处理它 ④抛它
1.异常范例ExceptionDemo01.java public class ExceptionDemo01{ public static void main(String args[]){ System.out.println("******* 计算开始 *******") ; int i = 10 ; int j = 0 ; int temp = i / j ; System.out.println("两个数字相除的结果:" + temp) ; System.out.println("******* 计算结束 *******") ; }
2.异常处理try-catch-finally模型 可能出现异常的语句; }catch(异常类1 异常对象){ 异常1的处理语句; }catch(异常类2 异常对象){ 异常2的处理语句; }… finally{ 一定要运行的语句; } 关键字的作用 try: 捕捉异常 catch: 处理异常 finally: 异常的统一出口 范例ExceptionDemo02.java
public class ExceptionDemo02{ public static void main(String args[]){ System.out.println("****** 计算开始 ********") ; int i = 10 ; int j = 0 ; try{ int temp = i / j ; // 此处产生了异常 System.out.println("两个数字相除的结果:" + temp) ; } catch ( ArithmeticException ae ){ System.out.println("出现异常了:" + ae) ; } System.out.println("******* 计算结束 *********") ;
验证finally的作用:异常的统一出口 public class ExceptionDemo03{ public static void main(String args[]){ System.out.println("******** 计算开始 *******") ; int i = 10 ; int j = 2 ; try{ int temp = i / j ; System.out.println("两个数字相除的结果:" + temp) ; }catch(ArithmeticException ae){ System.out.println("出现异常了:" + ae) ; }finally{ System.out.println("不管是否出现异常,都执行此代码") ; } System.out.println("******** 计算结束 *******") ;
多重catch处理异常 程序在开发中不会只存在一个异常,肯定会同时存在多个异常。此时就需要使用多个catch语句进行处理。 例:使用键盘输入两个数据,进行除法操作。 分析: 没有输入参数或个数不够——数组超出绑定异常 输入的参数不是数字——数字格式化异常 除数为零——算术异常 …… 范例ExceptionDemo04.java
public class ExceptionDemo04{ public static void main(String args[]){ int i , j ; try{ String str1 = args[0] ; // 接收第一个参数 String str2 = args[1] ; // 接收第二个参数 i = Integer.parseInt( str1 ); j = Integer.parseInt( str2 ); int temp = i / j ; // 此处产生了异常 System.out.println(“相除的结果:” + temp); }catch( ArithmeticException e){ System.out.println("算术异常:" + e) ; }catch( NumberFormatException e){ System.out.println("数字转换异常:" + e); }catch( ArrayIndexOutOfBoundsException e){ System.out.println("数组越界异常:" + e) ; }catch( Exception e){ System.out.println("异常:" + e) ;} System.out.println("****** 计算结束 *****") ; }}
3.异常信息的输出 直接打印异常对象 System.out.println(e) 使用Exception类提供的一个方法 printStackTrace( ) (开发中常用专门打印异常信息)
public class ExceptionDemo05{ public static void main(String args[]){ System.out.println("****** 计算开始 ********") ; int i = 10 ; int j = 0 ; try{ int temp = i / j ; // 此处产生了异常 System.out.println("相除的结果:" + temp) ; }catch( Exception e){ e. printStackTrace(); } System.out.println("******* 计算结束 *********") ;
4.throw、throws throws:如果一个方法引发了异常,但方法本身并不对该异常进行处理,而是交给被调用处处理。那么该方法就要用throws关键字声明。 throw:表示在方法中手工抛出一个异常。 在一般的开发中try…catch…finally、throw、throws联合使用的情况是最多的。{ }
范例ThrowsDemo.java class Math{ public int div( int i , int j ) throws Exception{ int temp = i / j ; // 此处有可能出现异常 return temp ; } public class ThrowsDemo{ public static void main(String args[]){ Math m = new Math() ; // 实例化Math类对象 try{ System.out.println("除法操作:" + m.div(10,0)) ; }catch( Exception e){ e.printStackTrace() ; // 打印异常
范例ThrowDemo.java public class ThrowDemo{ public static void main(String args[]){ try{ throw new Exception("自己抛着玩的。") ; }catch(Exception e){ System.out.println(e) ; }
5.实战 设计一个能进行两个整数相除的方法. 要求:①在计算开始处打印“计算开始”信息 ②在计算结束处打印“计算结束”信息 ③如有异常交给调用处处理 范例ThrowDemo03.java
class Math{ public int div(int i , int j) throws Exception{ System.out.println("***** 计算开始 *****") ; int temp = 0 ; // 定义局部变量 try{ temp = i / j ; // 此处有可能出现异常 }catch ( Exception e){ throw e ; }finally{ System.out.println("***** 计算结束 *****") ; } return temp ; }} public class ThrowDemo03{ public static void main(String args[]){ Math m = new Math() ; try{ System.out.println("除法操作:" + m.div(10,0)) ; }catch(Exception e){ System.out.println("异常产生:" + e) ; }
6.5 本章小结 1.异常是导致程序中断运行的一种指令流。当异常发生时,如果没有进行处理,程序将会中断执行。 2.异常可以使用try…catch进行处理,也可以使用try…catch…finally进行处理。在try语句中捕捉异常,然后在catch中处理异常,finally作为异常的统一出口,不管是否发生异常都要执行此段代码。
6.5 本章小结 3.异常的最大父类是Throwable,其分为两个子 类,分别是Exception、Error。Exception表示程序可以处理的异常;而Error表示JVM错误, 一般不由程序开发人员处理。 4.发生异常后,JVM会自动产生一个异常类的实例化对象,并匹配相应的catch语句中的异常类型,也可以利用对象的向上转型关系直接捕获Exception。 5.throws用在方法声明处,表示本方法不处理异常,交给被调用处处理;throw表示在方法中手工抛出一个异常。