1、异常,目标,2007 iSoftStone Holdings Ltd. All Rights Reserved.,3,什么是异常?,异常类通常用来定义程序所遇到的轻微意外。可以写代码来处理异常并继续程序执行,而不是让程序中断。例如:发生下列情况时,会出现异常: 想打开的文件不存在 网络连接中断 受控操作数超出预定范围 正在装载的类文件丢失,在程序中发生错误时,发现错误的方法能抛出一个异常到其调用程序。然后,调用方法捕获该异常,以一定的方法处理异常并继续程序执行。这个方案给程序员一个写处理程序的选择,来处理异常。它为系统和用户之间提供了一种友好的交互方式。增强程序的健壮性,异常机制有什么作用,p
2、ublic static void main(String args) int i = 0; String greetings = “Hello world!“,“No, I mean it!“,“HELLO WORLD!“; while (i 4) System.out.println (greetingsi);i+; ,示例(1),Hello world!No, I mean it!HELLO WORLD!Exception in thread “main“ java.lang.ArrayIndexOutOfBoundsException: 3原因:当i = 3是,按照循环中的规定,要输出
3、的greetings3不存在,超出了数组的边界,因而产生异常。,运行结果,2007 iSoftStone Holdings Ltd. All Rights Reserved.,7,异常体系结构,Error JVM系统内部错误,表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。Exception 表示一种设计或实现问题,即如果程序运行正常,从不会发生的情况(比如刚才的数组越界)。,分类说明,JAVA异常类都是系统类库中Exception类的子类。 Exception类是java.lang.Throwable类的一个子类,构造函数为:public E
4、xception();public Exception(String s);它从Throwable类那里继承了若干方法。常用的为:public String toString():返回异常类信息public void printStackTrace():在当前标准输出上输 出异常信息,异常类Exception,2007 iSoftStone Holdings Ltd. All Rights Reserved.,10,常见异常,异常的处理主要包括捕捉异常、程序流程的跳转和异常处理语句块的定义等。当一个异常被抛出时,应该有专门的语句来捕获这个被抛出的异常对象,这个过程被称为捕捉异常。当一个异常类的
5、对象被捕捉或接收后,用户程序就会发生流程的跳转,系统中止当前的流程而跳转至专门的异常处理语句块,或直接跳出当前程序和Java虚拟机回到操作系统,异常处理,在Java程序里,异常对象是依靠try/catch语句来捕捉和处理的。try/catch异常处理语句块分为try语句块和catch语句块,其格式如下:try /try语句块,可能产生异常情况 catch (SqlException e1) /catch语句块,对异常进行处理 catch (NullPointException e2) /catch语句块,对异常进行处理 catch (Exception e3) /catch语句块,对异常进行处
6、理 将能够抛出异常的代码放入try块中,然后创建相应的catch块的列表。 如果生成的异常与catch中提到的相匹配,catch条件的块语句就被执行。 在try块之后,可能有许多catch块,每一个都处理不同的异常。一定要将特殊的异常写在前面,try和catch语句,13,public static void main(String args) int i = 0; String greetings = “Hello world!“,“No, I mean it!“,“HELLO WORLD!“; trywhile (i 4) System.out.println (greetingsi);i
7、+;/ 当try块发生异常的时候,异常会被catch所捕获catch(Exception e)System.out.println(“捕获异常:“+e.toString();,示例(2),多异常处理是通过在一个try块后面定义若干个catch块来实现的,每个catch块用来接收和处理一种特定的异常对象 。,多异常的捕获和处理,在设计catch块处理不同的异常时,一般应注意如下问题: (1) catch块中的语句应根据异常的不同而采取不同的处理方法,比较通用的操作是打印异常和与该异常相关的信息,包括异常名称和产生异常的方法名等。(2) 由于异常对象与catch块的匹配是按照catch块的先后排列
8、顺序进行的,所以要处理多异常时应注意认真设计各catch块的排列顺序。(3) 在用多catch语句时,记住异常子类必须在它们任何父类之前使用是很重要的。这是因为运用父类的catch语句将捕获该类型及其所有子类类型的异常。这样,如果子类在父类后面,子类将永远不会到达,设计catch块处理,finally语句只用来控制从trycatch语句转移到另一部分前的一些必要的善后工作,这些工作包含了关闭文件或释放其他有关系统资源。finally语句执行的是一种强制的无条件执行,即无论在程序中是否出现异常,也不管出现的是哪一种异常,即使try代码块中包含有break、continue、return或者thr
9、ow语句,都必须执行finally块中所包含的语句。在出现和未出现异常的情况下都要执行的代码,可以放到finally子句中,finally语句,17,public static void main(String args) int i = 0; String greetings = “Hello world!“,“No, I mean it!“,“HELLO WORLD!“; trywhile (i 4) System.out.println (greetingsi);i+;catch(Exception e)System.out.println(“捕获异常:“+e.toString();fi
10、nallySystem.out.println(“finally 继续执行“);,示例(3),Java应用程序在运行时如果出现了一个可识别的错误,就会产生一个与该错误相对应的异常类的对象,这个对象包含了异常的类型和错误出现时程序所处的状态信息,这个异常对象首先被交给Java虚拟机,由虚拟机来寻找具体的异常处理者。在Java中把产生异常对象并将其交给Java虚机的过程称为称为异常的抛出,异常的抛出,异常是通过关键字 throw 抛出,程序可以用throw语句引发明确的异常。如: try if(flag0) throw new NullPointerException(); throw语句的操作数
11、一定是Throwable类类型或Throwable子类类型的一个对象,使用 throw,如果一个方法可以导致一个异常但不处理它,就必须在方法声明中包含一个throws子句。 一个throws子句列举了一个方法可能引发的所有异常类型。(除Error类型以外) 一个方法可以引发的所有其他类型的异常必须在 throws子句中声明。如果不这样做,将会导致编译错误,throws,/ 定义方法的时候已经定义了必须抛出了一个异常private void getConn()throws SQLExceptionSystem.out.println();public static void main(Strin
12、g args) ThrowsDemo t = new ThrowsDemo();try /调用此方法的时候必须捕获或者throws继续向上一层抛,/ 否则通不过编译t.getConn(); catch (SQLException e) e.printStackTrace();,示例(3),当一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。如果父类抛出多个异常,那么重写方法必须抛出那些异常的一个子集,也就是说不能抛出新的异常,注意,1 通过扩展Exception 类来创建2 包含一个构造函数和方法,体系对应的错误信息class MyException extends Excepti
13、on private int idCode ;public MyException(String msg,int id)super(msg);this.idCode = id ;public int getIdCode() return idCode;,自定义异常,public class MyExceptionDemopublic double devide(int x,int y)throws MyExceptionif(y0)throw new MyException(“被除数为负数“,-1);return x/y;public static void main(String args)
14、MyExceptionDemo t = new MyExceptionDemo();try t.devide(10, -3); catch (MyException e) e.printStackTrace();,使用自己的异常,1 如果可以提前检测出来的异常,应该尽量避免使用,影响性能 2 不要为每个可能出现的异常语句都设置try catch 尽量避免总是catch exception 类,应该catch具体的子类,这样可以使程序更加清晰。不要压制,隐瞒异常,将不能处理的异常向外抛,而不是捕获之后随便处理。不要在循环中使用try catch,使用异常的技巧和原则,异常的定义 异常的分类 try、catch 和 finally 语句 throw、throws子句 定义自己的异常,总结,立足高位加速远航,谢谢!,