2022年异常知识点.docx
精选学习资料 - - - - - - - - - 学习必备 欢迎下载学问点:1、 什么是反常;反常是程序正常执行过程中显现的不正常的情形;例如:人在成长过程 中,是个正常的执行过程,但成长过程中会常常生病,这就是反常;为了防止这种不正 常的情形,我们会实行一系列措施,比如:从小锤炼身体,吃新奇洁净的食物,养分合 理的搭配,以增强我们的体质;提高抗病才能;程序我们为了提高它运行时的健壮性,我们也得采纳一些措施;那么怎么提高程序的健壮性呢?获来增加程序的健壮性;2、 反常捕获的次序是怎样的呢?当一个反常发生或抛出;JAVA 程序中我通过反常的捕那么正常的程序执行序列将被终止,程序将对反常进行处理,我们称之为抛出反常被捕获;JAVA 中通过使用try-catch语句把可能抛出反常的语句包起来;例如:前面讲到资源文件类 件加载时,使用以下语句捕获反常;try Properties pro=new Properties; Pro.loadnew FileInputStream “c:/abc.properties” ; catchIOException eSystem.out.printlne; 3、 反常的类型是怎样的呢?Properties 类在进行文全部反常类的超类是Throwable ;在Throwable下有两个子类,一个是Error ,另一个是Exception ;Error 是错误,程序员无法掌握,Exception 是反常,程序员可以通过反常捕获加以掌握;例如: 电脑运行中中毒了,我们可以通过杀毒软件来处理,处理完了以后可以连续 使用, 这叫反常,我们可以掌握;但电脑显现了蓝屏或死机的时候,我们就不能进行任何操 作了;这就是错误,我们无法掌握;4、 程序中反常是怎么发生的呢?String inputStr = JOptionPane.showInputDialognull, 请输入年龄 ”;int age = Integer.parseIntinputStr; 以上代码要求用户输入年龄,年龄是个数字;但通过showInputDialog 得到的是个字符串;名师归纳总结 - - - - - - -第 1 页,共 11 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载所以我们需要 Integer.parseIntinputStr ,将字符串转成数字;这个时候,假如用户输入的不是 一 个 数 字 型 的 字 符 串 , 而 是 一 个 非 数 字 的 字 符 串 ( 如 字 母 、 符 号 ), 在 进 行Integer.parseIntinputStr 转化是就会发生一个反常;假如我们不对它作任何处理,程序就有可能因此终止掉;5、 怎样捕获一个反常呢;a、 把正常运行的代码放在 try 块里;b、 假如程序中显现了反常就把反常抛出在catch 中,假如 catch 中能捕获抛出的反常;那么就会进行处理;处理的代码写在 catch 块中;try 程序块里面的语句是按次序执行的语句当 try 程序块里面的语句抛出一个反常的时候,程序的掌握转向了相匹配的 catch 程序 块, catch 程序块里面的语句被执行;当反常发生后, 程序执行将忽视 try 程序块中剩余的语句,连续执行程序块后面的语句;假如在 try 程序块中没有抛出反常,那么 catch 块将被忽视;程序将连续执行 try-catch 下面的语句例如:try System.out.println “开头 ”;/1 int x=4/0;/2 System.out.println “执行 ”;/3 catchException e System.out.println “发生反常 ”;/4 System.out.println “反常处理外部 ” ; 名师归纳总结 这是发生反常的情形,在try 块里次序执行,先打出“ 开头”,没有反常连续执行,当第 2 页,共 11 页执行到第 2 行时,由于0 不能做除数,所以会发生一个算术反常;这个时候就会跳过try 块里剩下的语句转去执行catch 块中的内容; 所以第 3 行就不能执行; 跳到 catch 块中执行第4- - - - - - -精选学习资料 - - - - - - - - - 句,打出“ 发生反常”学习必备欢迎下载5 行“ 反常处理外部”;执行完以后接着往下次序执行;打出第try System.out.println “开头 ”;/1 int x=4/2;/2 System.out.println “执行 ”;/3 catchException e System.out.println “发生反常 ”;/4 System.out.println “反常处理外部 ” ; 这是正常情形,在 try 块里次序执行,先打出“ 开头”,没有反常连续执行,当执行到 第 2 行时,得到 x 的值为 2,不会有反常;这个时候连续执行到第 3 行,打出“ 执行”;因 为在 try 块中没有任何反常,执行完以后接着往下次序执行;打出第 5 行“ 反常处理外部”;在 Throwable 类中有两个方法,可以用于猎取抛出反常的信息getMessage printStackTrace 6、 抛出反常在一个 try-catch 语句中,当有多个catch 块的时候,它们被次序检查在检查过程中,留意反常的匹配关系是很重要的当一个反常被抛出,与它相匹配的catch 块被执行, 其它的 catch 块, 就被忽视掉不再执行名师归纳总结 - - - - - - -第 3 页,共 11 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载假如没有 catch 块匹配抛出的反常,那么系统会在堆栈中搜寻,找到一个匹配的捕获方 法;假如仍旧没有找到,那么系统将处理抛出反常什么叫反常和 catch 块相匹配:1、抛出的反常和捕获的反常是同一个类 2、抛出的反常是捕获反常的子类3、多个catch 块中 假如捕获的反常之间有继承关系那么不要把父类放在子类之前(这种做法也不被答应)4、尽量不要偷懒使用具体反常类而不要使用Exception 例如 : try int a= new int 4 ; System. out .printlna6;/1 int i=3/0;/2 catch java.lang.ArithmeticException e/ 捕获第 2行反常 System. out .println "算术错误 " ; catch java.lang.ArrayIndexOutOfBoundsException e / 捕获第 1行反常 System. out .println "数组下标越界 " ; 不同的反常由不同的catch 块进行捕获;发生反常时由相应的catch 块进行处理;Catch 块中怎么捕获反常?try int i=3/0; catchjava.lang.ArithmeticException e/ System.out.println" 算术错误 " try int i=3/0; 抛出反常和捕获反常是同一个类catchjava.lang.Exception e/ 抛出反常是捕获反常的子类 System.out.println" 算术错误 " 名师归纳总结 - - - - - - -第 4 页,共 11 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载try int a= new int 4 ; System. out .printlna6; catch java.lang. Exception e System. out .println "发生反常 " ; catch java.lang.ArrayIndexOutOfBoundsException e System. out .println "数组下标越界 " ; 这 种 方 式 不 被 允 许 , 因 为 catch 块 前 一 个 异 常 Exception 是 后 一 个 异 常 ArrayIndexOutOfBoundsException 的父类;所以有反常前一个反常 catch 块都捕 获了;后一个 catch 块永久不会被执行;编译会出错;try int a= new int 4 ; System. out .printlna6; catch java.lang.ArrayIndexOutOfBoundsException e System. out .println "数组下标越界 " ; catch java.lang.Exception e System. out .println "发生反常 " ; 这种方式答应;假如有数组下标越界反常由第一个 由其次个 catch 块处理;catch 块处理;假如有其它反常7、假如有一块代码不管是否发生反常抛出都要被执行,我们使用关键字finally这样的机制有助于我们进行系统资源的回收;比如:在数据库操作时,假如发生了反常,那么数据库连接就可能不会关闭,而始终长驻内存;在进行IO 文件读取和写入时,假如发生了反常就可能流不会关闭;所以使用 finally 可以解决这样的问题;Try catch finally 名师归纳总结 - - - - - - -第 5 页,共 11 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载这样的结构可以用警察抓小偷来说明,警察抓小偷,假如小偷守法(没有反常)就警察就不会抓他,假如小偷违法(发生反常),就警察就抓它往监狱里放(catch 代码块);不管抓没有抓到,警察工资照拿;finally 内容 public void change try int x=9/3; System.out.println“正常执行 ”; catch Exception e System. out .println "发生反常 " ; finally "finally内容 " System. out .println 由于正常执行,所以catch 里内容不会执行;执行结果是“ 正常执行” 和“finally 内容”publicvoid change try int x=9/0; System.out.println“正常执行 ”; catch Exception e System. out .println "发生反常 " ; finally "finally内容 " System. out .println 由于发生反常,所以catch 里内容执行;执行结果是“ 发生反常” 和“finally 内容”8、关于 finally 的问题大家都知道 return 是跳出方法的语句,假如在 try 里有 return 语句那么 finally 里的 内容会不会执行呢?答案是会的;会在 return 语句之前执行,执行完 finally 语句之后,return 语句再执行;名师归纳总结 - - - - - - -第 6 页,共 11 页精选学习资料 - - - - - - - - - publicvoid change 学习必备欢迎下载try int x=9/0;/1 return; catch Exception e System. out .println "发生反常 " ; finally "finally内容 " System. out .println System. out .println "反常外部内容 " ; 该代码发生了反常; 所以第一行代码以下语句会被忽视,所以 return 语句不会执行;该代码执行结果为“ 发生反常” 、“finally 内容” 、“ 反常外部内容”public void change try int x=9/4; System. out .println "正常执行 " ; return; catch Exception e System. out .println "发生反常 " ; finally "finally内容 " System. out .println System. out .println "反常外部内容 " ; 该代码没有发生反常;次序执行;先打“ 正常执行” ,遇到 return 语句后,在返回前,先执行“finally 内容” 再做返回;由于方法已经跳出,所以“ 反常外部内容”不会执行;名师归纳总结 - - - - - - -第 7 页,共 11 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载finally 在任何时候都会执行,但有一个例外那就是程序终止时,不会执行;public void change try int x=9/4; System.out.println“正常执行 ”; System.exit0; catch Exception e System. out .println "发生反常 " ; finally "finally内容 " System. out .println System. out .println "反常外部内容 " ; 由于没有反常, 所以“ 正常执行”会打出来, 但这个时候程序终止运行;所以 finally内容不会打出来;9、关于反常对象反常也是一个对象;它是Exception类或子类的一个对象publicvoid change try int x=9/0;/1 catch Exception e/2 System. out .println "发生反常 " ; 在执行到第 1 行时,发生了反常;这时候会产生一个和反常相匹配的反常对象;然 后在第 2 行时,用一个 Exception e 的一个变量去指向它;这个时候,假如人为的抛出一个反常也可以达到相同的成效;这就是 throw 语句;将显示的产生一个反常对象,并做抛出;语法如下:名师归纳总结 throw 反常对象 throw new Exception;第 8 页,共 11 页- - - - - - -精选学习资料 - - - - - - - - - 学习必备 欢迎下载10、传播反常 一个方法可以抛出反常,这样的话,在方法里我们就不用去捕获方法里可能发生的相关反常;那么谁去处理这个反常呢?由调用该方法的代码块去处理;那么怎么样在方法里 抛出反常呢?我们需要修改方法的声明头,声明方法传播的反常类型我们使用关键字 throws 来完成这个声明 例: void c throws Exception . void d throws Exception . 在 d方法中抛出了 Exception 反常,但在方法体里却可以不产生反常对象;就象要开枪 先瞄准,但瞄准后可以不开枪;11、反常的类型反常会为编译期反常和运行期反常;(或检查反常和非检查反常)其中运行期反常是RuntionException 类和它的子类;除此之外都是编译期反常;编译期反常是我们必需要捕获的,而运行期反常却可以捕获,也可以不捕获;就象警察 一样,大案和要案是必需要立案侦破的,而小偷小摸的毛贼,可以抓也可以不抓;编译反常我们必需要处理,要么用try-catch 包围,要么做方法抛出;假如一个方法抛出编译期反常,那么调用该方法时,必需处理,假如抛出运行期反常,那么调用该方法时,可处理可不处理;void C throws Exception . void a try c; catchException eSystem.out.println“反常 ” ; 名师归纳总结 - - - - - - -第 9 页,共 11 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载public class TException public static void mainString args TException te = new TException; te.throwException;/1 te.throwAException;/2 te.throwCException;/3 te.throwDException;/4 public void throwAException throws Throwable public void throwCExcetion throws Exception public void throwException throws MyException public void throwDException throws MyCException class MyCException extends Exception public MyCException public MyCExceptionString msg supermsg; class MyException extends RuntimeException public MyException public MyExceptionString msg supermsg; 代码分析:在 main 方法里分别调用了四个方法;其中第1 行代码调用throwException 方法;该方法抛出 MyException 反常;而 MyException 是 RuntimeException 的子类,所以可以不处理;不会发生编译错误; 第 2 行代码调用throwAException 方法,该方法抛出Throwable ;这是全部反常和错误的超类,包含编译期反常,所以必需处理;直接写的话,编译会出错;第 3 行调用 throwCException 方法,该方法抛出Exception 反常,包括编译反常,所以也必需捕获; 第 4 行调用 throwDException 方法, 该方法抛出 MyCException 反常, 而MyCException 是 Exception 的子类,所以也必需捕获;名师归纳总结 - - - - - - -第 10 页,共 11 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载12、断言Java 中新的断言机制只有在Java 2 SDK 1.4 及以上版本可用当你在编译和运行带有断言的Java 程序的时候,请确定使用正确的JDK 版本在方法里先肯定某个条件为真,假如条件满意,就执行方法,否就抛出一个错误(AssertionError);断言语句的标准语法如下 assert <布尔表达式 > 断言语句也可以像下面的这个语法形式:assert <布尔表达式 >: <表达式 > AssertionError类构造方法的参数值;在 <表达式 >的这个位置,描述了一个传递给这个参数值用以描述抛出错误的具体信息在 Java 2 SDK 1.4 以前的版本中,assert 是一个合法的非保留字的标示符;而在 Java 2 SDK 1.4 或以上版本中,为了保证兼容性,即被当做了一个保留字使用断言时,必需打开断言开关;具体语法如下:assert被当作了规章标示符对待,javac source 1.4 <源文件 > java ea <主类名 > 断言分类:名师归纳总结 前置断言:检测一个方法执行之前,检测条件必需为true. 第 11 页,共 11 页后置断言:检测一个方法执行之后,检测条件必需为true.- - - - - - -