《2022年异常及其处理知识点.docx》由会员分享,可在线阅读,更多相关《2022年异常及其处理知识点.docx(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选学习资料 - - - - - - - - - 学习必备 欢迎下载一.反常处理概述1. 程序正常执行次序:逐语句次序执行 . 2. 语句的正常完成和突然完成;3. 反常显现 .1 执行过程中显现错误时,系统会自动创建一个对象称作反常对象,包含出错信息并且抛出这个对象,2. 程序执行期间遇到无法连续执行的情形,程序员可以创建一个反常对象,然后使用 throw 语句抛出这个反常对象;4. 反常处理过程 . 1)终止程序的正常执行次序,转去查找处理该反常的代码 . 查找策略:第一在当前函数查找,没有找到就本方法终止,到调用该方法的方法中继续查找, 假如始终查找到main 方法也没有找处处理该反常的
2、代码,打印堆栈踪迹后程序结束;2).处理反常 .假如在调用链的某个方法中找处处理这个反常的代码,就复原程序正常 执行状态,执行这段代码以及之后的代码;二.与反常有关的语句1.throw expression 语句;2.try-catch-finally 语句 三.Throwable 类及其子类Throwable Error Exception RuntimeException 检查型反常 = Exception 及其子类 - RuntimeException 及其子类 Throwable 类的构造函数和方法 构造函数Throwable ThrowableString message 方法Str
3、ing getMessage String getLocalizedMessage void printStackTrace Throwable fillInStackTrace 四. throws 子句 -方法定义的完整语法;1.语法 . 方法修饰符结果类型方法名(形参表)throws 子句方法体throws 子句的语法是throws 反常类型名1, , 反常类型名n 其中 throws 是 java 保留字,诸反常类型名是检查型反常的名字;2. 对方法体的限制 . 方法体中抛出的任何检查型反常,无论是由throw 语句抛出的仍是由于调用其它方法而发生的检查型反常,其类型都必需是 throw
4、s 子句中列出的某个类型或其子类型;否就编译期间出错;因此,编译器能够保证:通过编译的程序中的全部检查型反常都得到了处理;名师归纳总结 - - - - - - -第 1 页,共 10 页精选学习资料 - - - - - - - - - 3. 对方法重写的限制. 学习必备欢迎下载子类重写方法f,那么子类的f 不能抛出比基类f 更多的检查型反常;但是答应重写的f 抛出较少的检查型反常,甚至不抛出任何检查型反常;重写子类方法时,假如答应子类方法抛出比基类方法更多的反常,那么将破坏“ 通过编译的程序中的全部检查型反常都得到了处理” 这一事实;反常及其处理 .一.反常处理概述在运行过程中,应用程序可能遇
5、到各种错误;例如,从一个已经关闭的流读数据;访问数组时数组下标越界;使用空引用调用方法等;很多程序员不检查可能的错误,理由是假如每执行一个语句都检查是否出错,将使程序的结构纷乱,难以懂得;为明白决程序的正确性和程序结构的清楚性之间的冲突,程序设计语言引入了反常及反常处理机制;下面是 java 语言的反常处理机制的粗略过程 : 1.程序运行时出错,抛出反常对象 .当程序执行过程中显现错误 例如 0 做除数,数组下标越界等 时,系统会自动创建一个对象 称作反常对象,包含出错信息 并且抛出这个对象,或者在程序执行期间遇到无法连续执行的情形 例如打开文件失败,连接数据库失败等 ,程序员可以创建一个反常
6、对象,然后使用throw 语句抛出这个反常对象;2.终止程序的正常执行次序,转去查找处理该反常的代码 .只要有反常对象 E 被抛出 无论是由系统抛出的仍是由 throw 语句抛出的 ,程序就立刻停止正常的执行次序,转去查找处理反常对象 E 的代码;查找策略是第一在当前方法中查找,没有找到就本方法终止,到调用该方法的方法中连续查找,假如始终查找到 打印堆栈踪迹后 程序终止;main 方法也没有找处处理该反常的代码,3.处理反常 .假如在调用链的某个方法中找处处理这个反常的代码,就执行这段代码以 及之后的代码;与反常处理有关的语句是 二. 与反常处理有关的语句1. throw 语句 语法: thr
7、ow expression;throw 语句,try-catch-finally 语句和 Throwable 类及其子类;这里 throw 是保留字, expression是一个表达式, 它的值肯定是某个 Throwable 类对象的引用; throw 语句的功能是:运算表达式得到一个 Throwable 对象的引用 e,抛出 e 使得系统进入反常处理状态,查找处理该类反常的 catch 子句;假如找到这样的 catch 子句,系统恢复到正常执行程序的状态,开头处理反常; 假如始终找不处处理该类反常的 catch 子句, 线程终止;例.看下面代码段/创建 Throwable 对象,系统并不进入
8、反常处理状态Throwable e=new Throwable; /其它代码,系统正常执行这些代码if B throw e; /抛出反常,系统进入反常处理状态,查找处理 e 的代码;else /系统仍然处于正常执行程序的状态,执行这些代码;2. try-catch-finally 语句语法 1:名师归纳总结 - - - - - - -第 2 页,共 10 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载try statements/ 称作 try 块catchException 类型 1 catchException 类型 n 语法 2:try e1statements_
9、1/ 称作 catch块 enstatements_n/ 称作 catch 块statements/ 称作 try 块catchException 类型 1 catchException 类型 n e1statements_1/ 称作 catch块 enstatements_n/ 称作 catch 块finally statements/ 称作 finally 块这里 try, catch,finally 都是 java 语言的保留字;e1,e2, ,en 是标识符;要特殊留意,诸catch 子句的反常类型应当子类型在前,父类型在后,否就编译出错;由于父类型的 catch会拦截子类型的反常对象
10、,使子类型的catch 永久也不会起作用,成为不行抵达的代码;执行 try 块正常完成try 块正常完成?因抛出 V 突然终止try-catch 语句正常完成有 catch 捕捉 V?没有执行下一语句有正常完成给 catch 中的 e 赋值 V try 语句因抛出 V 突然完成执行捕捉 V 的 catch 块catch 块正常完成?因缘由 R 突然完成try 语句因 R 突然完成try-catch 语句的语义名师归纳总结 - - - - - - -第 3 页,共 10 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载执行 try 块正常完成没有因抛出 V 突然完成1 tr
11、y 块正常完成?有 catch 捕捉 V?执行 finally 块2 因缘由 S 突然完成正常完成有F 块正常完成?给 catch 中的 e 赋值 V 正常执行捕捉 V 的 catch 块try 语句try 语句catch 块正常完成正常完成因缘由 S 1 执行下一语句突然完成;因缘由 R 突然完成2 因缘由 S 突然完成3 3 执行 finally 块执行 finally 块因缘由 S 突然完成正常完成?try 语句因缘由正常终止?try 语句因缘由S 正常正常try 语句try 语句因抛出 V S 突然完成;因缘由 R 突然完成;突然完成突然完成遗忘缘由 R 遗忘抛出 V try-catc
12、h-finally 语句的语义例. 名师归纳总结 - - - - - - -第 4 页,共 10 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载package test_try; class MyError extends Error /定义一个 Error 的子类 MyError MyError String ssupers; public class test_try static void throw_Error /定义方法,它抛出 Error 或 Exception throw new MyError zzzz; / throw new NullPointerE
13、xception; public static void mainString args try throw_Error ; /调用抛出反常的方法 catch NullPointerException e /捕捉并处理反常 System.out.printlnNullPointerException; catch Exception e /捕捉并处理反常 System.out.printlnException; finally /finally 块 System.out.printlnExecuting finally block.; 第一个 throw 语句起作用时 ,程序的输出;由于 My
14、Error继承自 Error ,因此两个catch 子句都不能捕捉这个反常;test_try.MyError: zzzz /反常没被捕捉;调用uncaughtException方法,输出堆栈踪迹;at test_try.test_try.throwErrortest_try.java:8 at test_try.test_try.maintest_try.java:13 Executing finally block. /此输出说明finally 块肯定执行;Exception in thread main 其次个 throw 语句起作用时程序的输出;processing NullPointe
15、rException Executing finally block. 三. 反常类 Throwable这时反常得处处理,因此不会输出堆栈踪迹;名师归纳总结 - - - - - - -第 5 页,共 10 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载是全部反常类的超类;它只有两个子类 Error 和 Exception;Error 类及其子类表示程序具有严峻的错误,例如 VirtualMachineError就是 Error 的一个子类;Exception 类表示程序的某种状态,该状态是应用程序期望捕捉的;Exception 类有为数众多的子类,像IOExceptio
16、n ,SQLException ,NoSuchFieldException,NoSuchMethodException RuntimeException 等等;其中 RuntimeException 是 Exception 的重要子类,它也有很多子类,像ArithmeticException ClassCastException NegativeArraySizeException NullPointerException IndexOutOfBoundsException 等等;Throwable Error Exception RuntimeException VirtualMachine
17、Error IOException SQLException NoSuchFieldException NoSuchMethodException . 检查型反常 ArithmeticException NullPointerException 反常类型层次检查型反常 .Exception 的子类,但不是RuntimeException 或其子类的全部反常类型统称 为 检 查 型 异 常 checking exception; 其 它 异 常 类 型 , 即Error及 其 子 类 型 和RuntimeException 及其子类型统称为非检查型反常unchecking exception;关
18、于检查型异常这一名称的来源,见方法定义中的 throws 子句;Throwable 类及其子类都是具体类,并且绝大多数类仅仅是名称不同,所具有的方法都是继承自 Throwable 类;名师归纳总结 - - - - - - -第 6 页,共 10 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载Throwable 类public class Throwable extends Object implements Serializable Throwable 类是全部 errors 和 exceptions的超类;只有该类及其子类的对象可由 Java Virtual Mach
19、ine 或 throw 语句抛出;也只有该类及其子类可以做 catch 子句的参数类型 . Throwable 类的实例用于指出反常情形已经显现,并且包含反常情形的相关信息;通常 throwable 类有两个构造函数:一个无参数的构造函数,一个带一个 String 型参数 msg的构造函数,参数msg给出反常情形的具体信息;Throwable 类的对象包含两类信息:1.关于反常情形的信息一个串 ;2.反常情形显现时执行堆栈的状态;构造函数Throwable 构造一个 Throwable 对象,具有空错误消息的;ThrowableString message 构造一个 Throwable 对象,
20、其错误消息是 message;方法String getMessage 返回当前 Throwable 对象的错误消息;String getLocalizedMessage 创建 Throwable 类的更具专用颜色的描述信息;继承Throwable 类的子类应当重写该方法, Throwable 类的 getLocalizedMessage与 getMessage功能相同;void printStackTrace 打印该 Throwable 对象的错误信息,并打印执行堆栈信息到标准错误流;具体打印形 式与实现有关;java.lang.NullPointerException 第一行是e.toStr
21、ing方法的结果,以下是堆栈信息at MyClass.M2MyClass.java:9 发生反常的语句所在方法名,文件名,行号 at MyClass.M1MyClass.java:6 调用前一方法的方法名,文件名,行号 at MyClass.mainMyClass.java:3 以后同上 这个例子由运行如下程序产生1 class MyClass 2public static void mainString argv 3M1null; 4 5 static void M1int a M2a; 67 8 static void M2int b 9System.out.printlnb0; 10 1
22、1 Throwable fillInStackTrace 把当前对象加入执行堆栈踪迹,返回当前对象作为值;常用于重新抛出反常;例. 名师归纳总结 1 package test_exception; 第 7 页,共 10 页- - - - - - -精选学习资料 - - - - - - - - - 2 public class test_exception 学习必备欢迎下载3 public static void mainString args 4 5 f1; 6 7 static void f1 8 f2 ; 9 10 static void f2 11 try 12 throw new Nu
23、llPointerException aaaa; 13 14 catchNullPointerException e 15 16 e.printStackTrace; 17 NullPointerException e1=NullPointerExceptione.fillInStackTrace; 18 System.out.printlne=e1; 19 e.printStackTrace; 20 throw NullPointerExceptione.fillInStackTrace; java.lang.NullPointerException: aaaa /由第 16 行的 prin
24、tStackTrace 打印 at my_1.my_1_main.f2test_exception.java:12 at my_1.my_1_main.f1test_exception.java:8 at my_1.my_1_main.maintest_exception.java:5 java.lang.NullPointerException: aaaa /由第 19 行的 printStackTrace 打印 at my_1.my_1_main.f2test_exception my_1_main.java:17 at my_1.my_1_main.f1test_exception my
25、_1_main.java:8 at my_1.my_1_main.maintest_exception my_1_main.java:5 java.lang.NullPointerException: aaaa /由第 20 行的 throw 引起 at my_1.my_1_main.f2test_exception my_1_main.java:20 at my_1.my_1_main.f1test_exception my_1_main.java:8 at my_1.my_1_main.maintest_exception my_1_main.java:5 true/由第 18 行输出,说
26、明e.printStackTrace 返回的就是e;Exception in thread main 四. throws 子句 -方法定义的完整语法 以前介绍的方法定义的语法是方法修饰符结果类型方法名(形参表)方法体方法定义的完整语法是名师归纳总结 方法修饰符结果类型方法名(形参表)throws 子句方法体第 8 页,共 10 页这里新增加的语法成分是throws 子句,它的语法是- - - - - - -精选学习资料 - - - - - - - - - throws 反常类型名学习必备欢迎下载1, , 反常类型名n 其中 throws 是 java 保留字,诸反常类型名是检查型反常的名字 但
27、它不会起任何作用) ;对方法体的限制 . (可以填写非检查型反常名,方法体中抛出的任何检查型反常,无论是由 throw 语句抛出的仍是由于调用其它方法而发生的检查型反常,其类型都必需是 译期间出错;throws 子句中列出的某个类型或其子类型;否就编这意味着假如方法f 的 throws 子句是 throws E1, ,Em,那么E 是假如 f 的方法体中有throw new E(“ ” )形式的语句,其中E 是检查型反常,那么E1, ,Em 中的一个,或者是E1, ,Em 中某一个的子类;假如方法 f 调用方法 g,那么 g 的 throws 子句中的每个检查型反常都必需是 E1, ,Em之一
28、或者是某个 Ek 的子类;否就要么方法 f 处理这个反常,要么编译时出错;并不要求方法 f 必需抛出 throws 子句列出的全部反常,而是说 f 只能抛出 throws 子句列出的检查型反常;因此,编译器能够保证:通过编译的程序中的全部检查型反常都得到了处理;这就命名这类反常为“ 检查型反常” 的缘由;对方法重写的限制 . 假设方法 f() throws E1, ,Em 是基类的一个方法;假如子类需要重写方法 f,那么f 不能抛出比基类 f 更多类型的检查型反常,它只能抛出 Ek 或 Ek 的子类型的反常; 但是允许重写的 f 抛出较少的检查型反常,甚至不抛出反常;重写子类方法时,假如答应子
29、类方法抛出比基类方法更多的反常,那么将破坏“ 通过编译的程序中的全部检查型反常都得到了处理” 这一事实;例.这个例子说明,一个方法抛出的检查型反常必需是显现在 public class test_checkedexception throws 子句中列出的反常;void g throws NoSuchMethodException,NoSuchFieldException /抛出两种检查型反常 void f throws NoSuchMethodException throw new NoSuchFieldException; /编译出错, throw 语句抛出的检查型反常/不在 throws
30、 子句中g; /编译出错,方法调用g抛出的检查型反常不在throws 子句中 void f1 throws NoSuchMethodException /虽然 throw 语句抛出了 throws 子句之外的检查型反常,但 f1 处理了该反常,正确;try throw new NoSuchFieldException; catchNoSuchFieldException e 名师归纳总结 - - - - - - -第 9 页,共 10 页精选学习资料 - - - - - - - - - void f2 throws 学习必备欢迎下载NoSuchMethodException /虽然 g抛出了
31、throws 子句之外的检查型反常,但 f2 处理了该反常,正确;try g; catchNoSuchFieldException e 下面的例子说明,重写的方法不能抛出更多的反常,但可以抛出较少的反常,甚至不抛出反常;class test_inherit extends test_checkedexception void f1 throws NoSuchMethodException,NoSuchFieldException /编译出错 .重写的 f1 比基类的 f1 抛出更多的检查型反常; void f2 /编译通过 .答应重写的方法比基类方法抛出更少的检查型反常,/甚至不抛出检查型反常; 习题 . 1.重写子类方法时,假如答应子类方法抛出比基类方法更多的反常,那么将破坏“ 通过编译的程序中的全部检查型反常都得到了处理” 这一事实;为什么?提示:方法 g 调用方法f,方法 f 至少有本类和基类两个版本;名师归纳总结 - - - - - - -第 10 页,共 10 页