




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章第八章 异常处置异常处置Exception)8.1 异常分类异常分类8.2 引发异常引发异常8.3 声明抛出异常声明抛出异常8.4 捕捉异常捕捉异常8.5 定义本人的异常类型定义本人的异常类型8.6 构造方法与异常处置构造方法与异常处置8.7 小结小结 try-catch-finally语句语句 ,其语法格式:其语法格式: try /能够发生异常的代码能够发生异常的代码 catch异常类型异常类型1 变量变量 /异常的处置代码异常的处置代码 catch异常类型异常类型2 变量变量 /异常的处置代码异常的处置代码 . finally /总是要执行的代码总是要执行的代码 产生异常语句thro
2、w抛出异常异常类构造异常的方法finally机制异常异常(例外例外) 是方法代码运转时出现的非正常形状,这种是方法代码运转时出现的非正常形状,这种非正常形状使程序无法或不能再正常地继续往非正常形状使程序无法或不能再正常地继续往下运转。下运转。常见的异常:常见的异常: 数组下标越界数组下标越界 除数为零除数为零 内存溢出内存溢出 文件找不到等。文件找不到等。 运转机制:运转机制: 当一个方法在运转时发生异常时,将产当一个方法在运转时发生异常时,将产生相应类型的一个异常对象、中止代码继生相应类型的一个异常对象、中止代码继续往下运转并寻觅相应的异常处置代码。续往下运转并寻觅相应的异常处置代码。异常处
3、置:异常处置:1 判别异常类型判别异常类型2 产生对象产生对象3 捕获处置异常捕获处置异常 异常对象记录着这个异常的一些描画和异常对象记录着这个异常的一些描画和形状信息。形状信息。 方法运转失败时,记录这个异常信息的方法运转失败时,记录这个异常信息的异常对象将产生或称为引发,抛出,异常对象将产生或称为引发,抛出,throw,它有两种引发方式:,它有两种引发方式: 1 系统自动引发系统自动引发 2 在程序中由在程序中由throw语句引发语句引发 异常对象引发后,系统根据异常对象的异常对象引发后,系统根据异常对象的类型,首先在当前方法寻觅相应的异常处置类型,首先在当前方法寻觅相应的异常处置代码,找
4、到后就将控制流转入该异常处置代代码,找到后就将控制流转入该异常处置代码并向其传送异常对象称为捕获该异常,码并向其传送异常对象称为捕获该异常,catch,异常处置代码可以根据接遭到的,异常处置代码可以根据接遭到的异常对象进展相应的处置;异常对象进展相应的处置;寻觅相应的异常处置代码的过程:寻觅相应的异常处置代码的过程:当前方法当前方法直接或间接调用者直接或间接调用者找到,传送异常对象并进展异常处置找到,传送异常对象并进展异常处置没有找到,调用默许的异常处置程序,没有找到,调用默许的异常处置程序,中止当前线程中止当前线程 举例没有异常处置的情况举例没有异常处置的情况1) class Excepti
5、onDivideBy0 2) static void method() int x = 0, z=10; int y = 10 / x; System.out.println(z=+z);public static void main(String args) method(); System.out.println(After method.); 11) Exception in thread main java.lang.ArithmeticException: / by zero at ExceptionDivideBy0.method(ExceptionDivideBy0.java:4
6、) at ExceptionDivideBy0.main(ExceptionDivideBy0.java:8)Press any key to continue.具有异常处置的情况具有异常处置的情况class ExceptionDivideBy0 static void method() int x = 0,z=10; try int y = 10 / x; System.out.println(z=+z); catch(ArithmeticException e) System.out.println(ArithmeticException); System.out.println(Afte
7、r try/catch blocks.); public static void main(String args) method(); System.out.println(After method.); ArithmeticExceptionAfter try/catch blocks.After method.每个异常由类每个异常由类Throwable或者它的一个子类的实例表或者它的一个子类的实例表示,这样的对象可被抛出并能被传送给适宜的异常示,这样的对象可被抛出并能被传送给适宜的异常处置代码处置。处置代码处置。Throwable类及其子类统称为异常类,类及其子类统称为异常类,每个异常类
8、表示一种异常类型。每个异常类表示一种异常类型。Throwable类是类是Object类的直接子类,其本身又有两类的直接子类,其本身又有两个直接子类:个直接子类: Error与与Exception类。类。RuntimeException类是类是Exception类的直接子类,如类的直接子类,如图图8-1所示。这里,所示。这里, Error类、类、RuntimeException类类和和Exception类分别代表某一类异常类型:类分别代表某一类异常类型:8.1 异常分类异常分类图图8-1 异常类型及其分类异常类型及其分类(1) Error类及其子类:类及其子类: 表示灾难性的、普通程序很表示灾难
9、性的、普通程序很难恢复的异常,例如:难恢复的异常,例如: NoClassDefFoundError类定义没找到异常:类定义没找到异常: JVM无法找到相应的无法找到相应的class文件。文件。 OutOfMemoryError内存越界异常:内存越界异常: JVM没没有足够的存储空间满足对象创建的要求。有足够的存储空间满足对象创建的要求。 NoSuchMethodError调用不存在的方法异常:调用不存在的方法异常: 在改动某个方法的签名后,原先要调用该方法的运在改动某个方法的签名后,原先要调用该方法的运用程序,在运转时就会抛出该异常。用程序,在运转时就会抛出该异常。 普通情况下,程序员可不用理
10、睬这类异常,它们普通情况下,程序员可不用理睬这类异常,它们虽然很严重,但很少发生。虽然很严重,但很少发生。(2) RuntimeException类及其子类:类及其子类: 表示设计或实现表示设计或实现方面的问题,例如:方面的问题,例如: ArithmeticException算术运算异常:算术运算异常: 算术运算术运算时发生的异常情况,如整数相除,除数为零。算时发生的异常情况,如整数相除,除数为零。 ClassCastException强迫类型转换异常:强迫类型转换异常: 把一把一个对象援用转换成一个不适宜的类型,如把一个对个对象援用转换成一个不适宜的类型,如把一个对象援用转换成某个子类类型。
11、象援用转换成某个子类类型。 NullPointerException空援用异常:空援用异常: 需求对象需求对象援用时运用了一个援用时运用了一个null援用。援用。 ArrayIndexOutOfBoundsException数组下标越数组下标越界异常:界异常: 下标值超出了数组大小。下标值超出了数组大小。 NumberFormatException数字格式异常:数字格式异常: 试试图将非数字格式字符串转换成数值。图将非数字格式字符串转换成数值。(3) Exception类及其非类及其非RuntimeException子类:子类: 表表示运转时因环境的影响而引发的异常,例如:示运转时因环境的影响
12、而引发的异常,例如: IOException输入输出异常:输入输出异常: 在在I/O操作失败操作失败或者被中断时引发。其子类包括:或者被中断时引发。其子类包括: EOFException、FileNotFoundException、InterruptedIOException等。等。 InterruptedException中断异常:中断异常: 当前等待或当前等待或睡眠线程被其他线程中断时引发。睡眠线程被其他线程中断时引发。 这类异常并非因设计或实现引起,是无法防止的。这类异常并非因设计或实现引起,是无法防止的。但普通情况下,程序员应该提供相应的代码捕捉和但普通情况下,程序员应该提供相应的代码
13、捕捉和处置。处置。受检查的异常和不受检查的异常:受检查的异常和不受检查的异常:受检查的异常受检查的异常 Exception类及其非类及其非RuntimeException子类属于受子类属于受检查的异常;检查的异常; 受检查的异常要受编译系统的检查。假设一个方法受检查的异常要受编译系统的检查。假设一个方法能够会引发这类异常而又不能适当处置,那么应该用能够会引发这类异常而又不能适当处置,那么应该用throws子句声明抛出;调用者或者用子句声明抛出;调用者或者用try-catch语句捕语句捕捉处置,或者也用捉处置,或者也用throws子句声明抛出,并由它的调子句声明抛出,并由它的调用者处置。用者处置
14、。 也就是说,对方法中能够会抛出的受检查异常,程也就是说,对方法中能够会抛出的受检查异常,程序员必需捕捉处置或声明抛出,两者必选其一,否那序员必需捕捉处置或声明抛出,两者必选其一,否那么编译系统将给出错误信息。么编译系统将给出错误信息。受检查的异常和不受检查的异常:受检查的异常和不受检查的异常:不受检查的异常:不受检查的异常: 类类Error和类和类RuntimeException及其子类属于不受检及其子类属于不受检查的异常,如图查的异常,如图8-1所示。所示。 不受检查的异常不受编译系统的检查。对这类异常,不受检查的异常不受编译系统的检查。对这类异常,程序员可以捕捉或声明抛出,但通常可以不加
15、理睬。程序员可以捕捉或声明抛出,但通常可以不加理睬。异常类的方法和属性异常类的方法和属性 (1)异常类的构造方法异常类的构造方法 public Exception() 创建新异常。创建新异常。public Exception(String message) 用字符串参数用字符串参数message描画异常信息创建新异常。描画异常信息创建新异常。 (2)异常类的方法异常类的方法public String toString() 前往描画当前异常对象信息的字前往描画当前异常对象信息的字符串。符串。 public String getMessage() 前往描画当前异常对象的详细前往描画当前异常对象的详
16、细信息。信息。 public void printStackTrace() 在屏幕上输出当前异常对在屏幕上输出当前异常对象运用堆栈的轨迹,即程序中先后调用了哪些方法,象运用堆栈的轨迹,即程序中先后调用了哪些方法,使得运转过程中产生了这个异常对象。使得运转过程中产生了这个异常对象。 所谓异常的引发是指因程序运转出现异常情况而产所谓异常的引发是指因程序运转出现异常情况而产生异常对象、进而转入异常处置过程的情形。生异常对象、进而转入异常处置过程的情形。Java运转系统在发现异常情况时会自动引发异常。运转系统在发现异常情况时会自动引发异常。自动引发异常自动引发异常 如下例如下例:8.2 引发异常引发异
17、常【例【例8-1】在发生异常情况时由运转系统引发异常】在发生异常情况时由运转系统引发异常class Demo public static void main(String args) int a = args.length; System.out.println(a = + a); int b = 42 / a; int c= 1 ; c4 = 99; System.out.println(After try/catch blocks.); throw引发异常引发异常 异常既可以在发生异常情况时由运转系统引发,异常既可以在发生异常情况时由运转系统引发,也可以在程序中用也可以在程序中用throw
18、语句显式引发。语句显式引发。格式如下:格式如下: throw new ArithmeticException();【例【例8-2】下面程序在被减数】下面程序在被减数a小于减数小于减数b时将引发时将引发ArithmeticException异常。异常。1) class Test 2) static int method(int a,int b) 3) if(a b) 4) throw new ArithmeticException(a b); /产生异常产生异常5) return a - b;6) 7) public static void main(String args) 8) method
19、(3, 5);9) 10) 下面是该程序的输出结果:下面是该程序的输出结果: Exception in thread main java.lang.ArithmeticException: a bat Test.method(Test.java:4)at Test.main(Test.java:8)假设一个方法引发的是受检查的异常且本人没有捕假设一个方法引发的是受检查的异常且本人没有捕捉,那么它必需用捉,那么它必需用throws子句声明抛出;子句声明抛出;该方法的调用者假设不对异常进展捕捉,那么也必该方法的调用者假设不对异常进展捕捉,那么也必需用需用throws子句声明抛出。子句声明抛出。下面
20、是包含下面是包含throws子句的方法定义的语法格式:子句的方法定义的语法格式: () throws .8.3 声明抛出异常声明抛出异常【例【例8-3】下面程序与例】下面程序与例8-2中的程序根本一样,只是中的程序根本一样,只是method方法能够抛出的是一个受检查的方法能够抛出的是一个受检查的Exception异常,但它既没有异常,但它既没有捕捉也没有声明抛出,所以是不能经过编译的。捕捉也没有声明抛出,所以是不能经过编译的。1) class Test 2) static int method(int a,int b) 3) if(a b) 4) throw new Exception(a b
21、);5) return a - b;6) 7) public static void main(String args) 8) int r = method(3, 5);9) System.out.println(r = + r);10) 11) throws Exception throws Exception 对不受检查的异常,同样可以声明抛出或进展对不受检查的异常,同样可以声明抛出或进展捕捉,这在语法上是允许的。捕捉,这在语法上是允许的。 无论是受检查的异常还是不受检查的异常,对不无论是受检查的异常还是不受检查的异常,对不受检查的异常,不论能否声明了异常抛出,异常一旦受检查的异常,不论能
22、否声明了异常抛出,异常一旦引发,其处置过程是一致的,即:引发,其处置过程是一致的,即: 异常沿着方法调用异常沿着方法调用的反方向传播,寻觅并转入适宜的异常处置代码执行。的反方向传播,寻觅并转入适宜的异常处置代码执行。假设方法及其一切的调用者都没有提供适宜的处置代假设方法及其一切的调用者都没有提供适宜的处置代码,那么异常将最终传播到运转系统,运转系统调用码,那么异常将最终传播到运转系统,运转系统调用默许的异常处置代码后终止程序执行。图默许的异常处置代码后终止程序执行。图8-2阐明了例阐明了例8-2和例和例8-3中异常引发和传送的过程。中异常引发和传送的过程。图图8-2 异常传播过程表示图异常传播
23、过程表示图回想超类和子类中方法覆盖的要求:回想超类和子类中方法覆盖的要求:两个方法具有一样的方法签名即方法名和方法的两个方法具有一样的方法签名即方法名和方法的参数完全一致参数完全一致前往类型一样前往类型一样覆盖方法的访问级别不能低于被覆盖方法的访问级覆盖方法的访问级别不能低于被覆盖方法的访问级别别覆盖方法覆盖方法(子类方法子类方法)不能比被覆盖方法不能比被覆盖方法(超类方法超类方法)抛出更多类型的受检查异常。抛出更多类型的受检查异常。下面经过例子加以阐明。下面经过例子加以阐明。【例【例8-4】有以下类定义:】有以下类定义: 1) import java.io.*;2) 3) class Tes
24、tClass4) void testM(BaseClass o) throws IOException5) o.method(); 7) 8) 9) class BaseClass10) void method() throws IOException11) . 12) 请问下面哪些请问下面哪些BaseClass类的子类定义是合法的?类的子类定义是合法的?A) class A extends BaseClass void method() throws IOException B) class B extends BaseClass void method() throws Exception
25、 C) class C extends BaseClass void method() throws EOFException,FileNotFoundException D) class D extends BaseClass void method() throws IOException,InterruptedException E) class E extends BaseClass void method() F) class F extends BaseClass void method() throws IOException,NullPointerException 【例2.1
26、0】从键盘输入一个整数和实数,并输出它们的和 import java.io.*; / 引入引入java.io包包class InputDemo public static void main(String args) throws IOException / 用规范输入用规范输入System.in创建一个创建一个 BufferedReaderBufferedReader br = new BufferedReader(new InputStreamReader(System.in); System.out.print(请输入一个整数:请输入一个整数:);String str = br.read
27、Line(); / 输入字符行存入字符串输入字符行存入字符串int i = Integer.parseInt(str);/ 转换字符串为整型数据转换字符串为整型数据 System.out.print(请输入一个实数:请输入一个实数:); str = br.readLine(); float f = Float.parseFloat(str); System.out.print(它们的和是:它们的和是:+(i+f); 假设不加以捕捉,引发的异常将沿着方法调用的假设不加以捕捉,引发的异常将沿着方法调用的反方向往外抛出和传播,直至反方向往外抛出和传播,直至Java运转系统。通常,运转系统。通常,这并
28、不是所希望的结果。普通来说,引发异常的方这并不是所希望的结果。普通来说,引发异常的方法的调用者应该捕捉,并根据详细情况处置异常,法的调用者应该捕捉,并根据详细情况处置异常,从而阻止异常继续往外传播。从而阻止异常继续往外传播。Java运用运用try-catch-finally语句来捕捉和处置能够发生的异常,该语句的语句来捕捉和处置能够发生的异常,该语句的语法格式如下:语法格式如下: 8.4 捕捉异常捕捉异常try / 此处是能够发生异常的代码此处是能够发生异常的代码 catch( ) / 异常的处置代码异常的处置代码 catch( ) / 异常的处置代码异常的处置代码finally / 总是要执
29、行的代码总是要执行的代码该语句包含该语句包含try、catch和和finally三个子句。其中,三个子句。其中,catch子句可以子句可以有多个,而且至少有一个有多个,而且至少有一个catch子句或子句或finally子句。子句。try子句包含一段能够要发生异常的代码。一旦发子句包含一段能够要发生异常的代码。一旦发生异常,将由后面的生异常,将由后面的catch子句捕捉处置。每个子句捕捉处置。每个catch子句有一个参数,参数类型指明该子句可以捕捉的子句有一个参数,参数类型指明该子句可以捕捉的异常类型。假设子句指定的参数类型是所发生的异异常类型。假设子句指定的参数类型是所发生的异常的类或者是其超
30、类,那么阐明常的类或者是其超类,那么阐明catch子句可以捕捉子句可以捕捉该异常。此时,运转系统将把异常对象的援用值传该异常。此时,运转系统将把异常对象的援用值传送给送给catch子句的参数变量,并将控制流转移到该子句的参数变量,并将控制流转移到该catch子句,执行子句内的异常处置代码。之后,接子句,执行子句内的异常处置代码。之后,接着执行着执行try语句后面的代码。语句后面的代码。假设假设try子句内的代码没有发生任何异常,那么跳子句内的代码没有发生任何异常,那么跳过过catch子句,直接执行子句,直接执行try语句后面的代码。语句后面的代码。8.4.1 try和和catch子句子句cla
31、ss Demo public static void main(String args) try int a = args.length; System.out.println(a = + a); int b = 42 / a; int c= 1 ; c4 = 99; catch(ArithmeticException e) / 捕获算术运算异常捕获算术运算异常 System.out.println(Divide by 0: + e); catch(ArrayIndexOutOfBoundsException e) System.out.println(Array index oob: + e
32、); System.out.println(After try/catch blocks.); 【例【例8-5】try和和catch子句举例子句举例a = 0Divide by 0: java.lang.ArithmeticException: / by zeroAfter try/catch blocks.最后阐明两点:最后阐明两点: (1) 当发生异常时,假设有当发生异常时,假设有catch捕捉到了异常,那么捕捉到了异常,那么不论详细的异常处置代码如何甚至不含任何语不论详细的异常处置代码如何甚至不含任何语句,句,Java运转系统都以为该异常已被消除;运转系统都以为该异常已被消除;(2) 当
33、执行完异常处置代码后,控制流并不会回到异当执行完异常处置代码后,控制流并不会回到异常发生处,而是执行常发生处,而是执行try语句后面的代码假设没有语句后面的代码假设没有finally子句。子句。 try子句内的代码能够会发生多种类型的异常,而子句内的代码能够会发生多种类型的异常,而try语句也允许有多个语句也允许有多个catch子句,每个子句,每个catch子句可以子句可以捕捉一种类型包括子类型的异常。捕捉一种类型包括子类型的异常。 当然,每次执行当然,每次执行try语句时,至多只能抛出一个异语句时,至多只能抛出一个异常,相应地,至多只能有一个异常处置代码被执行。常,相应地,至多只能有一个异常
34、处置代码被执行。 8.4.2 多个多个catch子句子句 当异常发生时,运转系统将按先后次序依次判别当异常发生时,运转系统将按先后次序依次判别各各catch子句,假设发现某个子句,假设发现某个catch子句可以捕捉该异子句可以捕捉该异常,就执行其中的处置代码,而其后面的常,就执行其中的处置代码,而其后面的catch子句子句将被忽略。将被忽略。 留意:处置子类型异常的留意:处置子类型异常的catch子句一定要放在处子句一定要放在处置超类型异常的置超类型异常的catch子句之前。子句之前。 假设将一个处置超类型异常的假设将一个处置超类型异常的catch子句放在处置子句放在处置子类型异常的子类型异常
35、的catch子句之前,或者两个子句之前,或者两个catch子句捕子句捕捉同一类型的异常,编译系统都将给出错误信息。捉同一类型的异常,编译系统都将给出错误信息。public class Test2 public static void main (String args) int x=0; int y; try y=100/x; catch (Exception ex) ex.printStackTrace(); catch (ArithmeticException ex) ex.printStackTrace(); (ArithmeticException ex)(Exception ex)T
36、est2.java:9: 已捕捉到异常 java.lang.ArithmeticException catch (ArithmeticException ex) 1 错误编译不经过:运用运用finally子句的益处是:子句的益处是: 控制流不论以何种缘由分开控制流不论以何种缘由分开try语句,都要先执行语句,都要先执行finally子句。子句。 所以,可以将那些无论能否发生异常、异常无论能所以,可以将那些无论能否发生异常、异常无论能否被捕捉都需求执行的代码放置在否被捕捉都需求执行的代码放置在finally子句内。子句内。8.4.3 finally子句子句控制流分开控制流分开try语句的情况可分
37、为以下几种:语句的情况可分为以下几种: try子句代码正常执行,没有引发异常;子句代码正常执行,没有引发异常; try子句代码执行时引发异常,但被子句代码执行时引发异常,但被catch子句捕捉处子句捕捉处置;置; try子句代码执行时引发异常,但没有子句代码执行时引发异常,但没有catch子句能捕子句能捕捉处置;捉处置; try子句代码执行时引发异常,且被子句代码执行时引发异常,且被catch子句捕捉,子句捕捉,但在执行异常处置代码时发生新的异常。但在执行异常处置代码时发生新的异常。留意:因留意:因return、break或或continue等跳转语句不论等跳转语句不论是出如今是出如今try子
38、句中,还是出如今子句中,还是出如今catch子句中要分开子句中要分开try语句时,同样需求先执行语句时,同样需求先执行finally子句。子句。1) class FinallyDemo 2) static void m1(int i) 3) try 4) if(i = 2) 5) System.out.println(第第2种情况:种情况: 发生算术运算异常发生算术运算异常);6) throw new ArithmeticException();7) if(i = 3) 8) System.out.println(第第3种情况:种情况: 发生数字格式异常发生数字格式异常);9) throw n
39、ew NumberFormatException();10) if(i = 4) 11) System.out.println(第第4种情况:种情况: 发生数组下标越界异常发生数组下标越界异常);12) throw new ArrayIndexOutOfBoundsException();13) 14) System.out.println(第第1种情况:种情况: 没有发生异常没有发生异常);15) 【例【例8-9】finally子句举例子句举例15) catch(ArithmeticException e)16) System.out.println(异常被捕捉处置异常被捕捉处置); 17)
40、 catch(ArrayIndexOutOfBoundsException e)18) System.out.println(异常被捕捉,但又被重新引发异常被捕捉,但又被重新引发);19) throw e; 20) finally21) System.out.println(这是这是finally子句子句); 23) System.out.println(这是这是try语句后的代码语句后的代码);24) 25) public static void main(String args)26) for(int i = 1; i java Testcaught java.lang.ArrayInde
41、xOutOfBoundsException: 0 in mainexiting from main假设命令行的第假设命令行的第1个参数为非数字格式字符串,下面是程序的输个参数为非数字格式字符串,下面是程序的输出结果:出结果: C:java Test aaacaught java.lang.NumberFormatException: aaa in m1exiting from m1exiting from main假设命令行的第一个参数为数字假设命令行的第一个参数为数字0,下面是程序的输出结果:,下面是程序的输出结果:C: java Test 0caught java.lang.Arithme
42、ticException: / by zero in mainexiting from maintry子句发生的异常可以由语句中的某个子句发生的异常可以由语句中的某个catch子句捕子句捕捉处置,但在执行捉处置,但在执行catch子句内的异常处置代码时也子句内的异常处置代码时也能够再引发新的异常。此时,原先的异常被遗弃,能够再引发新的异常。此时,原先的异常被遗弃,新的异常从新的异常从try语句抛出并向外传播。与语句抛出并向外传播。与未捕捉到的未捕捉到的异常异常类似,该新异常或者由外层类似,该新异常或者由外层try语句的语句的catch子子句捕捉,或者由方法的调用者处置。句捕捉,或者由方法的调用
43、者处置。8.4.5 再引发异常再引发异常1) import java.io.IOException; /【例【例8-8】再引发异常举例】再引发异常举例2) class Test 3) static void m1() throws IOException 4) try5) throw new RuntimeException(demo_1); 6) catch(RuntimeException e)7) System.out.println(caught + e + in m1); 8) throw new IOException(demo_2); 9) 10) public static v
44、oid main(String args) 11) try12) m1(); 13) catch(IOException e)14) System.out.println(caught + e + in main); 15) System.out.println(exiting from main);16) 17)下面是程序的输出结果:下面是程序的输出结果: caught java.lang.RuntimeException: demo_1 in m1caught java.io.IOException: demo_2 in mainexiting from main 8.5 定义本人的异常类
45、型定义本人的异常类型 自定义的异常类型必需是自定义的异常类型必需是Throwable类的类的子类。只需子类。只需Throwable类及其子类的实例才类及其子类的实例才可以被引发和捕捉。可以被引发和捕捉。通常将自定义异常类型定义成通常将自定义异常类型定义成Exception的的子类,以产生受检查的异常。子类,以产生受检查的异常。 Java异常处置机制的特点是方法的调用异常处置机制的特点是方法的调用者必需认识和处置方法能够会抛出的受检者必需认识和处置方法能够会抛出的受检查异常,而对不受检查的异常,调用者那查异常,而对不受检查的异常,调用者那么可以不加理睬。么可以不加理睬。例:在定义银行类时,假设取
46、钱数大于余额那么作为异常处置(InsufficientFundsException)。思绪: 产生异常的条件是余额少于取额,因此能否抛出异常要先判别该条件。 确定产生异常的方法,应该在取钱方法withdrawal中产生异常InsufficientFundsException 。 处置异常安排在调用withdrawal的时候,因此withdrawal方法要声明异常,由上级方法捕获并处置。 要定义好本人的异异常。public class InsufficientFundsException extends Exception private Bank excepbank; private doub
47、le excepAmount; InsufficientFundsException(Bank ba, double dAmount) excepbank = ba; excepAmount = dAmount; public String toString() String str = The balance + excepbank.getbalance() + The withdrawal was+excepAmount; return str; class Bank double balance; /余额余额 public void deposite(double dAmount) /存
48、钱存钱 if(dAmount0.0) balance = balance + dAmount; public void withdrawal(double dAmount) throws InsufficientFundsException /取钱取钱 if( balancedAmout ) throw new InsufficientFundsException(this, dAmount); balance = balance-dAmount; public double getbalance() /获取余额获取余额 return balance; public class Excepti
49、onDemo public static void main(String args) try Bank ba = new Bank(); ba.deposite(50); ba.withdrawal(100); System.out.println(Withdrawal successful!); catch(Exception e) System.out.println(e.toString(); 【例】设计本人的异常。从键盘输入一个【例】设计本人的异常。从键盘输入一个doubledouble类类型的数,假设不小于型的数,假设不小于0.00.0,那么输出它的平方根,假,那么输出它的平方根,
50、假设小于设小于0.00.0,那么输出提示信息,那么输出提示信息 输入错误!输入错误! 。 import java.io.import java.io.* *; ;class MyException extends Exceptionclass MyException extends Exception double x; double x; MyException(double x) MyException(double x) this.x=x; this.x=x; public String toString() public String toString() return return
51、输入错误输入错误:x0.0+ x=+x; :x0.0+ x=+x; public class MySqrt static void test(double x) throws MyException if(x 0.0) throw new MyException(x); else System.out.println(Math.sqrt(x); public static void main(String args) throws IOException try System.out.print(求输入实数的平方根求输入实数的平方根,请输入一个实数请输入一个实数:); BufferedRead
52、er br = new BufferedReader(new InputStreamReader(System.in); String s = br.readLine(); test(Double.parseDouble(s); catch(MyExceptionClass e) System.out.println(e.toString(); 与普通方法一样,构造方法也可以引发异常、捕与普通方法一样,构造方法也可以引发异常、捕捉异常或者声明抛出异常。实践上,构造方法有时捉异常或者声明抛出异常。实践上,构造方法有时比普通方法更需求运用异常处置机制。对于普通方比普通方法更需求运用异常处置机制。对
53、于普通方法,有时可以经过前往一个特殊值来表示其执行出法,有时可以经过前往一个特殊值来表示其执行出现了异常。例如,一个方法的前往类型是一种援用现了异常。例如,一个方法的前往类型是一种援用类型,且在正常情况下它总是能前往一个对象的援类型,且在正常情况下它总是能前往一个对象的援用,那么就可以前往一个用,那么就可以前往一个null值表示非正常情况,而值表示非正常情况,而不是抛出异常。这种处置方式不适用于构造方法。不是抛出异常。这种处置方式不适用于构造方法。构造方法没有前往类型,构造方法体不能运用带表构造方法没有前往类型,构造方法体不能运用带表达式的达式的return语句。下面是构造方法引发和抛出异常语句。下面是构造方法引发和抛出异常的一个例子:的一个例子: 8.6 构造方法与异常处置构造方法与异常处置1 class TimeException extends Ex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CRIA 19004-2023浓缩天然胶乳低蛋白质胶乳规格
- T/CRIA 16010-2021输送带用钢帘子布
- T/CNFIA 161-2022食品接触用环保型涂布纸和纸板材料及制品
- T/CMA HG027-2021载重汽车轮胎均匀性试验机和动平衡试验机校准用轮胎
- T/CIQA 8-2020铅精矿中锑、铋含量的测定电感耦合等离子体原子发射光谱法
- T/CIE 147-2022空间行波管加速寿命试验评估技术规范
- T/CHTS 10042-2021小客车专用高速公路工程技术指南
- T/CHSDA 0001-2024公路工程建设期碳排放计算标准
- T/CHC 2001-2020生殖健康咨询服务规范
- T/CECS 10370-2024给水用不锈钢沟槽式管件
- 成都设计咨询集团有限公司2025年社会公开招聘(19人)笔试参考题库附带答案详解
- 2021年周施工进度计划表
- 起重机械日常点检表
- 说明书hid500系列变频调速器使用说明书s1.1(1)
- 消化系统疾病护理题库
- 金属非金属地下矿山六大系统简介
- 建筑施工重大危险源的辨识及控制措施
- 光伏组件项目合作计划书(范文)
- 常用扣型总结
- 年产吨燃料乙醇工厂设计
- 产程观察与分娩记录
评论
0/150
提交评论