Java语言系统 异常-补充_第1页
Java语言系统 异常-补充_第2页
Java语言系统 异常-补充_第3页
Java语言系统 异常-补充_第4页
Java语言系统 异常-补充_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java异常的捕获与处理学习目标 重点、难点Company Logo重点与难重点与难点点异常的捕获及处理异常的捕获及处理主要内容异常基本概念异常类及其子类异常处理 运行时异常 捕获异常 声明异常 抛出异常 学习目标理解异常处理机制了解异常类及其子类掌握异常的捕获及处理掌握异常的抛出掌握自定义异常3一、异常机制简介l在进行程序设计时,错误的产生是不可避免的,如何处理错误?把错在进行程序设计时,错误的产生是不可避免的,如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?这是任何程序设计语误交给谁去处理?程序又该如何从错误中恢复?这是任何程序设计语言都要解决的问题。言都要解决的问题。lJav

2、aJava异常是异常是JavaJava提供的用于处理程序中错误的一种机制。所谓错误,提供的用于处理程序中错误的一种机制。所谓错误,是在是在程序运行过程中程序运行过程中发生的异常事件,比如除发生的异常事件,比如除0 0溢出、数组越界、文件溢出、数组越界、文件找不到等,这些事件的发生将阻碍程序的正常运行。找不到等,这些事件的发生将阻碍程序的正常运行。l为了加强程序的健壮性和容错性,程序设计时,应充分考虑可能发生为了加强程序的健壮性和容错性,程序设计时,应充分考虑可能发生的异常事件并作出相应的处理。的异常事件并作出相应的处理。4一、异常基本概念一、异常基本概念l异常异常是在程序运行过程中发生的异常事

3、件,比如是在程序运行过程中发生的异常事件,比如0 0溢出,数组越界,溢出,数组越界,文件找不到等。文件找不到等。l异常处理异常处理使用使用 trytry,catchcatch,throwthrow,throwsthrows,finallyfinally关键字来尝关键字来尝试可能未成功的操作,处理失败,以及在事后清理资源。试可能未成功的操作,处理失败,以及在事后清理资源。lJavaJava通过通过面向对象的方法面向对象的方法来处理异常。来处理异常。(各种不同的异常事件进行(各种不同的异常事件进行分类,把异常事件当成对象来处理)分类,把异常事件当成对象来处理)把生成异常对象并把它提交给运行时系统的

4、过程称为把生成异常对象并把它提交给运行时系统的过程称为抛出抛出(throw)(throw)一个异常。一个异常。 运行时系统从生成异常的方法开始进行回溯,直到找到包含相应异运行时系统从生成异常的方法开始进行回溯,直到找到包含相应异常处理的方法为止,这一个过程称为常处理的方法为止,这一个过程称为捕获捕获(catch)(catch)一个异常。一个异常。方法运行过程中发生异常,则该方法生成一个异常对象,并把它交给运行时系统,运行时系统再处理异常示例lpublic class ExcTest lpublic static void main(String args) lint a=3;lint b=0;

5、lint c=a/b;lSystem.out.println(c);ll5异常示例lpublic class ExcTest lpublic static void main(String args) lint a=3;lint b=0;l if(b=0)l System.out.println(“除数不能为除数不能为0”);l elsel int c=a/b;l System.out.println(c);l ll6使用传统的方式(ifelse)处理异常。不好:表示异常情况有限,且正常代码和异常代码混在一起,不利于维护。Java按照面向对象的思想处理异常7二、异常类及其子类二、异常类及其子类

6、所有异常类型都是所有异常类型都是内置类内置类Throwable的子的子类类用于用于Java运行时,系统运行时,系统的严重错,由的严重错,由Java虚拟虚拟机生成并抛出,包括动机生成并抛出,包括动态链接失败、虚拟机错态链接失败、虚拟机错误、线程死锁等,一般误、线程死锁等,一般不做处理。不做处理。用于用户程序可能用于用户程序可能捕获的异常,也是捕获的异常,也是用来创建用户异常用来创建用户异常类型子类的类。类型子类的类。ErrorError类对象是由类对象是由JavaJava虚拟机生成并抛出;通常虚拟机生成并抛出;通常JavaJava程序不对该类异常进行处理程序不对该类异常进行处理Exception

7、Exception类对象是由类对象是由JavaJava程序处理或抛出。有程序处理或抛出。有不同的子类分别对应于不同类型的异常。不同的子类分别对应于不同类型的异常。运行时异常,可以不做处理非运行时异常,必须处理Java异常机制的优点l通过面向对象的方法把各种不同的通过面向对象的方法把各种不同的异常事件分类异常事件分类,利用类的层次性可以把,利用类的层次性可以把多个具有相同父类的异常统一处理,也可以针对不同的异常分别处理,提多个具有相同父类的异常统一处理,也可以针对不同的异常分别处理,提高了错误处理的灵活性。高了错误处理的灵活性。lJavaJava的异常处理机制将的异常处理机制将“常规常规”代码和

8、处理异常的代码分开代码和处理异常的代码分开,增强了程序,增强了程序的可读性的可读性( (想象一下想象一下C C语言用语言用if-elseif-else语句处理异常的情景语句处理异常的情景) )。l异常对象可以沿调用栈自动向上传播,而不是异常对象可以沿调用栈自动向上传播,而不是C C语言中通过函数的返回值语言中通过函数的返回值来传播,这样可以传递更多的信息并且简化代码的编写,利于查找和调试来传播,这样可以传递更多的信息并且简化代码的编写,利于查找和调试代码错误。代码错误。8异常情况表示为异常类,发挥类的可扩展和可重用性可以灵活处理异常,有能力处理异常就捕获处理,没有能力就抛出,由方法调用者处理常

9、见异常及其用途 2-19异常说明RuntimeException java.lang包中运行时异常的基类 ArithmeticException 算术错误,如除以 0 IllegalArgumentException 方法收到非法参数 ArrayIndexOutOfBoundsException 数组下标出界 NullPointerException 试图访问 null 对象引用 SecurityException 试图违反安全性 10常见异常及其用途 2-2异常(非运行时异常)说明(直接继承自Exception类)AWTException AWT 中的异常 IOException I/O 异

10、常的根类 FileNotFoundException 不能找到文件 ClassNotFoundException不能加载请求的类EOFException 文件结束 IllegalAccessException 对类的访问被拒绝 NoSuchMethodException 请求的方法不存在 InterruptedException 线程中断 11三、异常处理的种类三、异常处理的种类l运行时异常运行时异常 可以不做处理可以不做处理l使用使用trytrycatchcatchfinallyfinally语句捕获异常语句捕获异常 可能引发异常的语句封入在可能引发异常的语句封入在 try try 块内,而

11、处理异常的相应语句则封入在块内,而处理异常的相应语句则封入在 catch catch 块内。块内。l通过通过throwsthrows子句声明异常,还可以定义自己的异常类,并子句声明异常,还可以定义自己的异常类,并用用throwthrow语句抛出它。语句抛出它。 在方法声明中包含在方法声明中包含 throws throws 子句,通知潜在调用者,如果发生了异常,必须由子句,通知潜在调用者,如果发生了异常,必须由调用者处理。调用者处理。由五个关键字 try、catch、throw、throws 和 finally 处理。12运行时异常运行时异常lRuntimeException类及其子类类及其子类

12、可以不做处理可以不做处理,系统会把生成的异常对,系统会把生成的异常对象交给默认的异常处理程序,在标准输出上显示异常的内容以及发生象交给默认的异常处理程序,在标准输出上显示异常的内容以及发生异常的位置。异常的位置。leg: public class ExcTest lpublic static void main(String args) lint a=3;lint b=0;lint c=a/b;lSystem.out.println(c);ll哈哈,可以不做处理!哈哈,可以不做处理!Exception in thread main java.lang.ArithmeticException:

13、/ by zeroat com.exp.ExcTest.main(ExcTest.java:11)运行时异常例子public class RuntimeExceptionProc public static void main(String args) int i=0,n=0,sum=0; int a=5,6,7,8; for(i=0;i=5;i+) System.out.println(ai);/数组越界,运行时异常数组越界,运行时异常 sum+=ai; System.out.println(“平均值平均值”+(sum/n);/异常一旦发生,异常一旦发生,程序终止,不再执行程序终止,不再执行

14、 13java.lang.ArrayIndexOutOfBoundsException: 414常见的运行时异常运行时异常(RuntimeException子类)说明ArithmeticException 算术错误,如除以 0 ,如r/0ArrayIndexOutOfBoundsException 数组下标出界 NullPointerException 试图访问 null 对象引用 NegativeArraySizeException数组的长度时负数ClassNotFoundException不能加载请求的类(向下转型时)15四、捕获异常四、捕获异常使用使用trytrycatchcatchfi

15、nallyfinallyl基本格式基本格式try 可能产生异常的语句可能产生异常的语句/ 不能有其它语句分隔不能有其它语句分隔catch (Etype1 e1) 处理异常处理异常1的语句的语句catch (Etype2 e2) 处理异常处理异常2的语句的语句finally 事后处理语句事后处理语句其中,catch可以有一个或多个,而且至少有一个catch语句或finally语句o try块包含可能产生异常的代码o try块后跟有一个或多个catch块,但最多只有一个会被执行o 每个catch块声明其能处理的一种特定类型的异常o 每个catch块都是一段异常处理代码o 无论是否发生异常,fina

16、lly块都将被执行,用来完成一些清理工作,如关闭文件等.16示例:try-catch捕获和处理异常public class Try1public static void main(String args)int i=0,n=0,sum=0;int a=5,6,7,8;try for(i=0;i=5;i+) System.out.println(ai); sum+=ai; System.out.println(“平均值平均值”+(sum/n); catch(ArrayIndexOutOfBoundsException e) System.out.println(数组异常数组异常:+e.toStr

17、ing(); catch(Exception e) System.out.println(异常异常:+e.toString(); a4将引发一个数组将引发一个数组越界异常越界异常在在catch块中处理块中处理数组异常数组异常除数不能为除数不能为0,引发,引发异常,实际上没有发异常,实际上没有发生生在在catch块中处理除数块中处理除数不能为不能为0异常异常5678数组异常:java.lang.ArrayIndexOutOfBoundsException: 4try-catch-finallyltrytry块块 用用 指定了一段可能抛出一个或多个异常的代码,同时也指定了它后面指定了一段可能抛出一

18、个或多个异常的代码,同时也指定了它后面catchcatch语句所捕获的异常的范围。语句所捕获的异常的范围。 trytry指定的代码中,当抛出一个异常,指定的代码中,当抛出一个异常,后面的代码不会被执行。后面的代码不会被执行。lcatchcatch块块 ,可以有多个,每一块处理一个异常。,可以有多个,每一块处理一个异常。 catchcatch语句的参数包括一个异常类型(语句的参数包括一个异常类型(必须为必须为ThrowableThrowable类的子类,指类的子类,指明明catchcatch语句所处理的异常类型语句所处理的异常类型)和一个异常对象(由运行时系统在)和一个异常对象(由运行时系统在t

19、rytry所指定的代码块中生成并由虚拟机捕获)。所指定的代码块中生成并由虚拟机捕获)。 内为对象的处理的语句,其中可以调用对象的方法。内为对象的处理的语句,其中可以调用对象的方法。lfinallyfinally块块 通过通过finallyfinally语句可以指定一块代码,语句可以指定一块代码,无论无论trytry中抛出或不抛出,中抛出或不抛出,也也无论无论catchcatch语句的异常类型是否于抛出的异常类型一致,语句的异常类型是否于抛出的异常类型一致,finallyfinally都要执行。都要执行。通常进程资源的清除,如关闭文件。通常进程资源的清除,如关闭文件。17例外:如果try块中存在

20、System.exit(0)语句,那么就不会执行finally块中的代码,因为System.exit(0)会终止当前运行的Java虚拟机,程序会在虚拟机终止前结束执行。18捕获异常例子public class Try1public static void main(String args)int i=0;int a=5,6,7,8; try for(i=0;i=4;i+) System.out.println(a+i+=+ai); System.out.println(3/0=+(3/0); catch(ArrayIndexOutOfBoundsException e) System.out.

21、println(数组异常数组异常:+e.toString(); catch(Exception e) System.out.println(异常异常:+e.toString(); finally System.out.println(“程序运行结束程序运行结束”); 注意l当产生异常时,程序从上到下依次判断该异常是否是该当产生异常时,程序从上到下依次判断该异常是否是该catchcatch(Exception_x eException_x e)块中)块中Exception_xException_x类或其子类对象。若是,则认为类或其子类对象。若是,则认为相匹配,执行相应的处理。因此,相匹配,执行相

22、应的处理。因此,安排安排catchcatch语句时,语句时,catchcatch的异常应的异常应符合子类在前,父类在后;从特殊到一般的原则。符合子类在前,父类在后;从特殊到一般的原则。l如果没有异常产生,所有的如果没有异常产生,所有的catchcatch块都被略过不执行。块都被略过不执行。l也可以用一个也可以用一个catchcatch语句处理多个异常类型,这时它的异常类型参数应语句处理多个异常类型,这时它的异常类型参数应该是这多个异常类型的父类。该是这多个异常类型的父类。l程序设计中要根据具体的情况来选择程序设计中要根据具体的情况来选择catchcatch语句的异常处理类型。语句的异常处理类型

23、。 19思考public class Try1 public static void main(String args) int i = 0, sum = 0, n = 0; int a = 5, 6, 7, 8 ; try for (i = 0; i = 5; i+) System.out.println(ai); sum += ai; System.out.println(平均值平均值 + (sum / n); catch (Exception e) System.out.println(异常异常: + e.toString(); catch (ArrayIndexOutOfBoundsE

24、xception e) System.out.println(数组异常数组异常: + e.toString(); 将上例中两个处理异常的顺序倒过来,对吗?五、声明抛出异常五、声明抛出异常 throwsthrowsl声明异常是一个说明性的子句,只能加在方法头部的后边。声明异常是一个说明性的子句,只能加在方法头部的后边。 格式:返回类型格式:返回类型 方法名(方法名( 参数列表参数列表 )throws throws l一个方法声明抛出异常,表示该方法一个方法声明抛出异常,表示该方法可能可能抛出所声明的异常,从而要抛出所声明的异常,从而要求该求该方法的调用者方法的调用者,在程序中对这些异常加以注意和

25、处理(如用,在程序中对这些异常加以注意和处理(如用try-try-catch-finallycatch-finally)。)。l若一个方法没有声明异常,则该方法仍可能会抛出异常,只不过这些若一个方法没有声明异常,则该方法仍可能会抛出异常,只不过这些异常不要求方法的调用者加以注意。异常不要求方法的调用者加以注意。l即使一个方法声明抛出异常,该方法仍可能抛出不在声明列表之中的即使一个方法声明抛出异常,该方法仍可能抛出不在声明列表之中的异常。异常。21六、手动抛出异常六、手动抛出异常(throw语句)l手动抛出异常手动抛出异常 格式:格式:throw throw ; 其中:异常对象必须是其中:异常对

26、象必须是ThrowableThrowable类或其子类的对象,任何从类或其子类的对象,任何从ThrowableThrowable派生的类都可以用派生的类都可以用throwthrow语句抛出,语句抛出, 例如:例如:throw new Exceptionthrow new Exception(“这是一个异常这是一个异常”);); throw new Stringthrow new String(“能抛出异常吗?能抛出异常吗?”);); /错误错误 throw new throw new MyException(“someMyException(“some infomationinfomation

27、”);”);l抛出异常用来表明程序遇到的错误无法正常执行而需要异常处理抛出异常用来表明程序遇到的错误无法正常执行而需要异常处理l异常可以由异常可以由trytry块中的语句抛出块中的语句抛出l也可以从被也可以从被trytry块中调用的方法中抛出块中调用的方法中抛出l异常抛出点后的代码在抛出异常后不再执行异常抛出点后的代码在抛出异常后不再执行, ,即即异常的抛出终止了块的异常的抛出终止了块的执行执行22throws是声明可能抛出异常,真正抛出异常是由throw完成。Throwable类的常用方法l构造方法构造方法lThrowableThrowable() ()lThrowable(StringTh

28、rowable(String message) message)l成员方法成员方法lString String toStringtoString() ()/返回包含异常描述的返回包含异常描述的StringString对象对象lString String getMessagegetMessage() () /返回返回JavaJava的标准错误信息的标准错误信息lgetStackTracegetStackTrace() /() /取到异常抛出的栈信息取到异常抛出的栈信息lvoid void printStackTraceprintStackTrace() /() /显示标准的错误信息和导致异常发生

29、显示标准的错误信息和导致异常发生的方法调用记录的方法调用记录23示例:抛出异常lpublic class DivException l public double method() throws Exceptionl int a,b;l Scanner sc=new Scanner(System.in);l System.out.println(请输入请输入a,b的值的值:);l a=sc.nextInt();l b=sc.nextInt();l if(b=0)l throw new Exception();l elsel return a/b;l l lpublic static void

30、main(String args) throws Exception /第一种处理方式第一种处理方式:继续抛出继续抛出l DivException d=new DivException();l d.method();/此方法的调用者必须对抛出的异常做处理,要么继续抛出,要么用此方法的调用者必须对抛出的异常做处理,要么继续抛出,要么用try进行处理进行处理l lpublic static void main(String args) DivException d=new DivException(); try d.method(); catch(Exception e) System.out.p

31、rintln(除数不能为0); e.printStackTrace(); /第二种处理方式,用try进行处理25须查异常和免检异常l须检查的异常须检查的异常lThrowable、Exceptionl免检的异常免检的异常lError、RuntimeExceptionl当在一个方法的代码中抛出一个须查异常时,这个异常或者被方法中的当在一个方法的代码中抛出一个须查异常时,这个异常或者被方法中的try-catch结构捕获,或者在方法的结构捕获,或者在方法的throws语句中声明语句中声明l编译器检查程序保证所有须检查的异常都被程序显式的处理编译器检查程序保证所有须检查的异常都被程序显式的处理l对须查异

32、常,方法的调用者一定要在程序中明确加以处理,或在方对须查异常,方法的调用者一定要在程序中明确加以处理,或在方法后再次声明这些异常。法后再次声明这些异常。l当须查异常没有被抛出当须查异常没有被抛出(throws)或捕获或捕获(try.catch)时,会引起编译错误。时,会引起编译错误。ThrowableErrorExceptionExceptionRuntimeException不要检查不要检查要检查要检查七、定义自己的异常类七、定义自己的异常类( (了解了解) )l声明一个新的异常类,必须从声明一个新的异常类,必须从Java已定义的异常类继承,已定义的异常类继承,通常从通常从Exception

33、及其子类(如及其子类(如IOException等)继承。等)继承。l为新的异常类定义属性和方法为新的异常类定义属性和方法,或重载父类的属性和方法,或重载父类的属性和方法,使这些属性和方法能够体现该类所对应的错误的信息。使这些属性和方法能够体现该类所对应的错误的信息。l从从Exception或或RuntimeException派生派生l区分须查的异常和运行时异常区分须查的异常和运行时异常l当满足一定条件则抛出当满足一定条件则抛出(throw)自定义异常自定义异常l抛出自定义异常的方法必须声明抛出异常抛出自定义异常的方法必须声明抛出异常(throws)l在调用该方法的程序块中捕获自定义异常在调用该

34、方法的程序块中捕获自定义异常2627定义自己的异常类class MyException extends Exception /自定义异常 public MyException() /构造方法 public MyException(String msg) super(msg); /调用父类构造方法public class Inheriting public static void f( ) throws MyException /必须声明抛出异常必须声明抛出异常 System.out.println(Throwing MyException from f(); throw new MyExcep

35、tion(); /抛出自定义异常 public static void main(String args) try f(); /处理自定义异常 catch(MyException e) e.printStackTrace(); /end of main() /end of class Inheriting继承自Exception28例子:计算两个数之和class NumberRangeException extends NumberFormatException public NumberRangeException() super(); /构造方法 public NumberRangeExc

36、eption(String msg) super(msg); /构造方法public class SumStr public String sum(String str1, String str2) throws NumberRangeException /声明抛出异常声明抛出异常 int int1 = Integer.parseInt(str1); int int2 = Integer.parseInt(str2); if( (int1 20) | (int2 20) ) throw new NumberRangeException /抛出异常抛出异常 (Numbers not within

37、 the specified range.); return Integer.toString(int1 + int2);29例子:计算两个数之和public static void main(String args) try String s = sum(args0, args1); System.out.println(“相加结果:” + s); catch (NumberRangeException e) System.out.println(“错误:” + e.getMessage(); catch (Exception e) e.printStackTrace(); 30例子:余额处

38、理l在定义银行类时,若取钱数大于余额则作为异常处理在定义银行类时,若取钱数大于余额则作为异常处理( (InsufficientFundsExceptionInsufficientFundsException) )。l产生异常的条件是余额少于取款额,因此是否抛出异常要先判断该条产生异常的条件是余额少于取款额,因此是否抛出异常要先判断该条件。件。l确定产生异常的方法,应该在取款方法(确定产生异常的方法,应该在取款方法(withdrawalwithdrawal)中产生异常)中产生异常InsufficientFundsExceptionInsufficientFundsException 。l处理异常安排在调用处理异常安排在调用withdrawalwithdrawal的时候,因此的时候,因此withdrawalwithdrawal方法要声方法要声明异常,由调用它的方法捕获并处理。明异常,由调用它的方法捕获并处理。31例子:余额处理class InsufficientFundsException extends Excepti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论