第十二章 异常处理

一、Java异常

异常:运行期出现的错误

Java异常:Java提供的一种用于处理程序中错误的机制

Java对异常的封装——异常类

观察异常出现的位置、层次和异常的类型

程序是“调”出来的

java异常的父类是Throwable,Throwable有两个子类一个是Error,一个是Exception

二、运行时的错误与异常

Error类:及其子类表示程序本身无法修复的错误,通常是由Java虚拟机抛出的严重错误。一般不会被扩展自定义错误类

Exception类:及其子类处理程序运行过程中发生的异常事件

(1)小错误,编译器可以接受,但是是有问题的

(2)说明:设计良好的程序应在异常发生时提供处理错误的方法,程序不会因为错误发生而阻断或发生不可预见的错误

(3)默认的异常处理方法:将异常信息打印到控制台

三、检查异常与非检查异常

检查异常(Checked Exception):代码写出来就会直接报错,需要提前进行预处理

(1)范围:RuntimeException及其子类

(2)经常出现的异常,可以人为处理也可以不处理

(3)编程导致的错误,程序员的错误

非检查异常(Unchecked Exception):代码写出来不会报错,但是在运行时可能会报错。

(1)范围:RuntimeException及其子类以外的异常类

(2)方法定义后所加的Exception,必须要人为处理,否则编译报错

(3)程序无法避免的错误,不是程序员的错误

四、Java异常的处理机制

1.异常的声明(throws):方法告诉编译器该方法有可能发生的错误,可能抛出的异常——异常在方法声明后被抛出

2.异常地抛出(throw):运行时出现异常事件,生成对应的异常对象,该对象封装了异常的信息并被提交给Java运行时系统——异常在程序中被抛出

3.异常的捕获(catch):Java运行时系统接收到异常对象,会寻找处理异常的代码并交给其处理

4.如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出

5.如果被调方法发生异常,主调方法仍处理不了此异常,则此方法的上层主调方法处理,如果main方法仍无法处理此异常,则抛出异常:

(1)如当前不是主线程(main方法),则终止该线程,其它线程依然运行

(2)如当前是主线程,则终止整个应用程序

五、运用throws声明异常

1.声明异常:

(1)Java处理异常的一种方式

(2)方法中的代码在运行时可能出现异常,但本方法中不必或不能确定如何处理此类异常

2.一般形式

[修饰符] 返回值类型 方法名 (参数表列){}

3.该方法中不对此类异常进行处理,由该方法的主调方法处理

(1)抛出异常:主调方法抛出异常的范围必须不小于被调方法抛出的异常(必须包括被调方法抛出的异常或其父类异常)

(2)捕获异常

六、捕获异常

一般形式:

try{…}
catch(Exception1 e1){…}
catch(Exception2 e2){…}
…finally
[finally{…}]

注:

(1)每个语句块都可以嵌套try…catch…finally语句

(2)每个不同代码块中定义的变量的作用域为本代码块

如:try代码块中定义的变量的作用域为try代码块,不能在catch和finally代码块中使用

1.try代码块

(1)try代码块中包含可能产生异常的代码

(2)try代码块不能独立出现,必须和catch代码块、finally代码块搭配使用

(3)try代码块后可以跟零个或多个catch代码块,零个或一个finally代码块

(4)try代码块后可以只跟一个finally代码块

(5)异常发生时,停止执行try中代码

2.catch代码块

(1)catch代码块中写入如果出现异常,处理异常的代码

(2)声明的对象必须是Throwable或其子类类型

(3)获取异常信息的常用方法:

getMessage():输出异常的类型

printStackTrace():指出异常的类型、栈的层次、及程序中的出现位置(默认)

(4)catch语句块中定义的异常类型必须是try语句块中出现的异常,或是其父类对象才能捕获此异常

(5)try语句块后边有多个catch代码块,异常发生时,根据异常的类型依次与catch代码块中异常类型匹配,如果异常匹配,就执行该代码块,不再执行其它catch代码块;如果没有匹配代码块程序将被中断

(6)try语句块后边有多个catch代码块时,父类异常不能写在子类异常的前面

注意:catch中一定要有处理异常的代码,切勿只捕获不处理

3.finally代码块

(1)finally代码块中通常写入受保护代码。例如:清空结果集、关闭文件、断开数据库等操作

(2)无论try代码块是否出现异常都会执行finally代码块

(3)finally语句块不被完全执行的特例:

             finally语句块发生异常

             Java虚拟机退出程序——System.exit();

4.throws手动抛出异常

一般形式:throws new ***Exception (…)

七、自定义异常

1.必须继承Exception类,创建自定义的异常类

2.在方法需要抛出异常的位置生成异常对象,用throw抛出

3.在方法的声明部分用throws声明方法可能抛出的异常

       应用场合:

           (1)方法调用了一个抛出检查异常的方法

           (2)程序运行时发生错误,利用throw抛出一个检查异常

4.方法重写中的异常处理:重写方法需要抛出与原方法所抛出异常类型一致(相同的类或子类)的异常或不抛出异常

八、必考题

1.写出五个你积累的异常
  Exception
  ArrayIndexOutOfBoundsException数组越界
  NullPointerException
  IOException
  RuntimeException
  FileNotFoundException等

2.final finally finalize的区别
(1)final可以修饰变量、方法和类,修饰的类没有子类,修饰的方法不能被重写,修饰的变量就是常量

(2)finally是异常中跟try配套的,无论try是否发生异常都会执行finally中的代码

(3)finalize在垃圾器执行的时候如果代码中有finalize方法,就会在本次回收对象的时候放过该对象,下次再回收

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值