1、第八章Java异常的概念和处理机制异常的概念和处理机制Java异常的分类异常的分类异常的捕获、处理和抛出异常的捕获、处理和抛出使用用户自定义异常使用用户自定义异常Java程序运行过程中所发生的异常事件可分为两类:程序运行过程中所发生的异常事件可分为两类:错误错误(Error):JVM系统内部错误、资源耗尽等严重情况系统内部错误、资源耗尽等严重情况 违例违例(Exception):其它因编程错误或偶然的外在因素导其它因编程错误或偶然的外在因素导致的一般性问题,例如:致的一般性问题,例如:对负数开平方根对负数开平方根 空指针访问空指针访问 试图读取不存在的文件试图读取不存在的文件 网络连接中断网络
2、连接中断public class Test8_1 public static void main(String args)String friends=lisa,bily,kessy;for(int i=0;i5;i+)System.out.println(friendsi);System.out.println(nthis is the end);程序Test8_1运行结果:java Test8_1lisabilykessyException in thread main java.lang.ArrayIndexOutOfBoundsException at Test8_1.main(Tes
3、t8_1.java:5)Press any key to continue.RuntimeException 错误的类型转换错误的类型转换 数组下标越界数组下标越界 空指针访问空指针访问 IOExeption 从一个不存在的文件中读取数据从一个不存在的文件中读取数据 越过文件结尾继续读取越过文件结尾继续读取 连接一个不存在的连接一个不存在的URL Java程序的执行过程中如出现异常,会自动生成一个异程序的执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给常类对象,该异常对象将被提交给Java运行时系统,这运行时系统,这个过程称为抛出个过程称为抛出(throw)异常。异常。当当
4、Java运行时系统接收到异常对象时,会寻找能处理这运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称一异常的代码并把当前异常对象交给其处理,这一过程称为捕获为捕获(catch)异常。异常。如果如果Java运行时系统找不到可以捕获异常的方法,则运运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的行时系统将终止,相应的Java程序也将退出。程序也将退出。程序员通常只能处理违例程序员通常只能处理违例(Exception),而对错误,而对错误(Error)无能为力无能为力public class Test8_2 public static void
5、 main(String args)String friends=lisa,bily,kessy;try for(int i=0;i5;i+)System.out.println(friendsi);catch(java.lang.ArrayIndexOutOfBoundsException e)System.out.println(index err);System.out.println(nthis is the end);程序java8_2运行结果:java java8_2lisabilykessyindex errthis is the endPress any key to cont
6、inue.捕获异常是通过try-catch-finally语句实现的。try./可能产生违例的代码可能产生违例的代码catch(ExceptionName1 e)./当产生当产生ExceptionName1型违例时的处置措施型违例时的处置措施catch(ExceptionName2 e)./当产生当产生ExceptionName2型违例时的处置措施型违例时的处置措施 finally./无条件执行的语句无条件执行的语句 try 捕获违例的第一步是用捕获违例的第一步是用try语句块选定捕获违例的范语句块选定捕获违例的范围。围。catch 在在catch语句块中是对违例对象进行处理的代码,每个语句块
7、中是对违例对象进行处理的代码,每个try语句块可以伴随一个或多个语句块可以伴随一个或多个catch语句,用于处理可语句,用于处理可能产生的不同类型的违例对象。与其它对象一样,可以能产生的不同类型的违例对象。与其它对象一样,可以访问一个违例对象的成员变量或调用它的方法。访问一个违例对象的成员变量或调用它的方法。getMessage()方法,用来得到有关异常事件的信息方法,用来得到有关异常事件的信息 printStackTrace()用来跟踪异常事件发生时执行堆栈的内容。用来跟踪异常事件发生时执行堆栈的内容。finally 捕获例外的最后一步是通过捕获例外的最后一步是通过finally语句为例外处
8、语句为例外处理提供一个统一的出口,使得在控制流转到程序理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管的其它部分以前,能够对程序的状态作统一的管理。不论在理。不论在try代码块中是否发生了异常事件,代码块中是否发生了异常事件,finally块中的语句都会被执行。块中的语句都会被执行。finally语句是任选的语句是任选的import java.io.*;public class Test8_3 public static void main(String args)FileInputStream in=new FileInputStream(myfile.t
9、xt);int b;b=in.read();while(b!=-1)System.out.print(char)b);b=in.read();in.close();程序Test8_3编译结果:E:exjavac Test8_3.javaE:exTest8_3.java:4:未报告的异常 java.io.FileNotFoundException;必须被捕获或被声明抛出FileInputStream in=new FileInputStream(myfile.txt);E:exTest8_3.java:6:未报告的异常 java.io.IOException;必须被捕获或被声明抛出b=in.re
10、ad();E:exTest8_3.java:9:未报告的异常 java.io.IOException;必须被捕获或被声明抛出 b=in.read();E:exTest8_3.java:11:未报告的异常 java.io.IOException;必须被捕获或被声明抛出 in.close();4 个错误import java.io.*;public class Test8_4 public static void main(String args)tryFileInputStream in=new FileInputStream(myfile.txt);int b;b=in.read();whil
11、e(b!=-1)System.out.print(char)b);b=in.read();in.close();catch(IOException e)System.out.println(e);finally System.out.println(Its ok!);声明抛弃违例是声明抛弃违例是Java中处理违例的第二种方式中处理违例的第二种方式 如果一个方法如果一个方法(中的语句执行时中的语句执行时)可能生成某种违例,但是并不可能生成某种违例,但是并不能确定如何处理这种违例,则此方法应声明抛弃违例,表明能确定如何处理这种违例,则此方法应声明抛弃违例,表明该方法将不对这些违例进行处理,而由该方
12、法的调用者负责该方法将不对这些违例进行处理,而由该方法的调用者负责处理处理 声明抛弃举例声明抛弃举例:public void readFile(String file)throws FileNotFoundException/读文件的操作可能产生读文件的操作可能产生FileNotFoundException类型的违例类型的违例FileInputStream fis=new FileInputStream(file);.import java.io.*;public class Test8_5public static void main(String args)Test8_5 t=new Te
13、st8_5();try t.readFile();catch(IOException e)System.out.println(e);public void readFile()throws IOException FileInputStream in=new FileInputStream(myfile.txt);int b;b=in.read();while(b!=-1)System.out.print(char)b);b=in.read();in.close();重写方法不能抛出比被重写方法范围更大的违例类型 public class A public void methodA()thr
14、ows IOException public class B1 extends TestA public void methodA()throws FileNotFoundException public class B2 extends TestA public void methodA()throws Exception Java异常类对象除在程序执行过程中出现异常时由系异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要需要人工创建并抛统自动生成并抛出,也可根据需要需要人工创建并抛出出 首先要生成例外对象,然后通过首先要生成例外对象,然后通过throw语句实现抛出操作
15、语句实现抛出操作(提提交给交给Java运行环境运行环境)。IOException e=new IOException();throw e;可以抛弃的例外必须是可以抛弃的例外必须是Throwable或其子类的实例。下面的或其子类的实例。下面的语句在编译时将会产生语法错误:语句在编译时将会产生语法错误:throw new String(want to throw);0806/test.java用户自定义例外类用户自定义例外类MyException,用于描述数据取值范围,用于描述数据取值范围错误信息:错误信息:class MyException extends Exception private i
16、nt idnumber;public MyException(String message,int id)super(message);this.idnumber=id;public int getId()return idnumber;public class Test8_6 public void regist(int num)throws MyException if(num 0)throw new MyException(人数为负值,不合理人数为负值,不合理,3);System.out.println(登记人数登记人数+num);public void manager()try regist(100);catch(MyException e)System.out.print(登记失败,出错种类登记失败,出错种类+e.getId();System.out.print(本次登记操作结束本次登记操作结束);public static void main(String args)Test8_6 t=new Test8_6();t.manager();Java异常的概念和处理机制异常的概念和处理机制Java异常的分类异常的分类异常的捕获、处理和抛出异常的捕获、处理和抛出使用用户自定义异常使用用户自定义异常