《2022年异常知识点.docx》由会员分享,可在线阅读,更多相关《2022年异常知识点.docx(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选学习资料 - - - - - - - - - 学习必备 欢迎下载学问点:1、 什么是反常;反常是程序正常执行过程中显现的不正常的情形;例如:人在成长过程 中,是个正常的执行过程,但成长过程中会常常生病,这就是反常;为了防止这种不正 常的情形,我们会实行一系列措施,比如:从小锤炼身体,吃新奇洁净的食物,养分合 理的搭配,以增强我们的体质;提高抗病才能;程序我们为了提高它运行时的健壮性,我们也得采纳一些措施;那么怎么提高程序的健壮性呢?获来增加程序的健壮性;2、 反常捕获的次序是怎样的呢?当一个反常发生或抛出;JAVA 程序中我通过反常的捕那么正常的程序执行序列将被终止,程序将对反常进行处理,
2、我们称之为抛出反常被捕获;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 是
3、错误,程序员无法掌握,Exception 是反常,程序员可以通过反常捕获加以掌握;例如: 电脑运行中中毒了,我们可以通过杀毒软件来处理,处理完了以后可以连续 使用, 这叫反常,我们可以掌握;但电脑显现了蓝屏或死机的时候,我们就不能进行任何操 作了;这就是错误,我们无法掌握;4、 程序中反常是怎么发生的呢?String inputStr = JOptionPane.showInputDialognull, 请输入年龄 ”;int age = Integer.parseIntinputStr; 以上代码要求用户输入年龄,年龄是个数字;但通过showInputDialog 得到的是个字符串;名师归纳
4、总结 - - - - - - -第 1 页,共 11 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载所以我们需要 Integer.parseIntinputStr ,将字符串转成数字;这个时候,假如用户输入的不是 一 个 数 字 型 的 字 符 串 , 而 是 一 个 非 数 字 的 字 符 串 ( 如 字 母 、 符 号 ), 在 进 行Integer.parseIntinputStr 转化是就会发生一个反常;假如我们不对它作任何处理,程序就有可能因此终止掉;5、 怎样捕获一个反常呢;a、 把正常运行的代码放在 try 块里;b、 假如程序中显现了反常就把反常抛出在c
5、atch 中,假如 catch 中能捕获抛出的反常;那么就会进行处理;处理的代码写在 catch 块中;try 程序块里面的语句是按次序执行的语句当 try 程序块里面的语句抛出一个反常的时候,程序的掌握转向了相匹配的 catch 程序 块, catch 程序块里面的语句被执行;当反常发生后, 程序执行将忽视 try 程序块中剩余的语句,连续执行程序块后面的语句;假如在 try 程序块中没有抛出反常,那么 catch 块将被忽视;程序将连续执行 try-catch 下面的语句例如:try System.out.println “开头 ”;/1 int x=4/0;/2 System.out.p
6、rintln “执行 ”;/3 catchException e System.out.println “发生反常 ”;/4 System.out.println “反常处理外部 ” ; 名师归纳总结 这是发生反常的情形,在try 块里次序执行,先打出“ 开头”,没有反常连续执行,当第 2 页,共 11 页执行到第 2 行时,由于0 不能做除数,所以会发生一个算术反常;这个时候就会跳过try 块里剩下的语句转去执行catch 块中的内容; 所以第 3 行就不能执行; 跳到 catch 块中执行第4- - - - - - -精选学习资料 - - - - - - - - - 句,打出“ 发生反常”
7、学习必备欢迎下载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 块中没有任何反常,执行完
8、以后接着往下次序执行;打出第 5 行“ 反常处理外部”;在 Throwable 类中有两个方法,可以用于猎取抛出反常的信息getMessage printStackTrace 6、 抛出反常在一个 try-catch 语句中,当有多个catch 块的时候,它们被次序检查在检查过程中,留意反常的匹配关系是很重要的当一个反常被抛出,与它相匹配的catch 块被执行, 其它的 catch 块, 就被忽视掉不再执行名师归纳总结 - - - - - - -第 3 页,共 11 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载假如没有 catch 块匹配抛出的反常,那么系统会在堆栈中
9、搜寻,找到一个匹配的捕获方 法;假如仍旧没有找到,那么系统将处理抛出反常什么叫反常和 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 .pri
10、ntln 算术错误 ; 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/ 抛出反常是
11、捕获反常的子类 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 数组下标越界 ; 这 种 方 式 不 被 允 许 ,
12、 因 为 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 .prin
13、tln 发生反常 ; 这种方式答应;假如有数组下标越界反常由第一个 由其次个 catch 块处理;catch 块处理;假如有其它反常7、假如有一块代码不管是否发生反常抛出都要被执行,我们使用关键字finally这样的机制有助于我们进行系统资源的回收;比如:在数据库操作时,假如发生了反常,那么数据库连接就可能不会关闭,而始终长驻内存;在进行IO 文件读取和写入时,假如发生了反常就可能流不会关闭;所以使用 finally 可以解决这样的问题;Try catch finally 名师归纳总结 - - - - - - -第 5 页,共 11 页精选学习资料 - - - - - - - - - 学习必备
14、 欢迎下载这样的结构可以用警察抓小偷来说明,警察抓小偷,假如小偷守法(没有反常)就警察就不会抓他,假如小偷违法(发生反常),就警察就抓它往监狱里放(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 里内容不会执行;执行结果是“ 正常执行” 和“fin
15、ally 内容”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 语
16、句之前执行,执行完 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 语句不
17、会执行;该代码执行结果为“ 发生反常” 、“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 内容” 再做返回;由于方
18、法已经跳出,所以“ 反常外部内容”不会执行;名师归纳总结 - - - - - - -第 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
19、.println 反常外部内容 ; 由于没有反常, 所以“ 正常执行”会打出来, 但这个时候程序终止运行;所以 finally内容不会打出来;9、关于反常对象反常也是一个对象;它是Exception类或子类的一个对象publicvoid change try int x=9/0;/1 catch Exception e/2 System. out .println 发生反常 ; 在执行到第 1 行时,发生了反常;这时候会产生一个和反常相匹配的反常对象;然 后在第 2 行时,用一个 Exception e 的一个变量去指向它;这个时候,假如人为的抛出一个反常也可以达到相同的成效;这就是 thro
20、w 语句;将显示的产生一个反常对象,并做抛出;语法如下:名师归纳总结 throw 反常对象 throw new Exception;第 8 页,共 11 页- - - - - - -精选学习资料 - - - - - - - - - 学习必备 欢迎下载10、传播反常 一个方法可以抛出反常,这样的话,在方法里我们就不用去捕获方法里可能发生的相关反常;那么谁去处理这个反常呢?由调用该方法的代码块去处理;那么怎么样在方法里 抛出反常呢?我们需要修改方法的声明头,声明方法传播的反常类型我们使用关键字 throws 来完成这个声明 例: void c throws Exception . void d t
21、hrows Exception . 在 d方法中抛出了 Exception 反常,但在方法体里却可以不产生反常对象;就象要开枪 先瞄准,但瞄准后可以不开枪;11、反常的类型反常会为编译期反常和运行期反常;(或检查反常和非检查反常)其中运行期反常是RuntionException 类和它的子类;除此之外都是编译期反常;编译期反常是我们必需要捕获的,而运行期反常却可以捕获,也可以不捕获;就象警察 一样,大案和要案是必需要立案侦破的,而小偷小摸的毛贼,可以抓也可以不抓;编译反常我们必需要处理,要么用try-catch 包围,要么做方法抛出;假如一个方法抛出编译期反常,那么调用该方法时,必需处理,假如
22、抛出运行期反常,那么调用该方法时,可处理可不处理;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.throwAExcept
23、ion;/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 My
24、CExceptionString msg supermsg; class MyException extends RuntimeException public MyException public MyExceptionString msg supermsg; 代码分析:在 main 方法里分别调用了四个方法;其中第1 行代码调用throwException 方法;该方法抛出 MyException 反常;而 MyException 是 RuntimeException 的子类,所以可以不处理;不会发生编译错误; 第 2 行代码调用throwAException 方法,该方法抛出Throwa
25、ble ;这是全部反常和错误的超类,包含编译期反常,所以必需处理;直接写的话,编译会出错;第 3 行调用 throwCException 方法,该方法抛出Exception 反常,包括编译反常,所以也必需捕获; 第 4 行调用 throwDException 方法, 该方法抛出 MyCException 反常, 而MyCException 是 Exception 的子类,所以也必需捕获;名师归纳总结 - - - - - - -第 10 页,共 11 页精选学习资料 - - - - - - - - - 学习必备 欢迎下载12、断言Java 中新的断言机制只有在Java 2 SDK 1.4 及以上
26、版本可用当你在编译和运行带有断言的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.- - - - - - -