1.方式一(抓抛模型):try-catch-finally
- 过程1:“抛”:程序在执行的过程中,一旦出现异常,就会在出现异常的代码处,生成对应异常类的对象,并将此对象抛出。一旦抛出,此程序就不执行其后的代码了。
- 过程2:“抓”:针对于过程1抛出的异常对象,进行捕获处理。此捕获处理的过程,就称为抓。一旦将异常进行了处理,代码就可以继续执行。
2.基本结构:
try{
......
}catch(异常类型1 e){
......
}catch(异常类型2 e){
......
}finally{
......
}
3.使用细节:
- 将可能出现异常的代码声明在try语句中。一旦代码出现异常,就会自动生产一个对应异常类的对象,并将此对象抛出。
- 针对try中抛出的异常类的对象,使用之后的catch语句进行匹配。一旦匹配上,就进入catch语句块进行处理。一旦处理结束,代码就可继续向下执行。
- 如果声明了多个catch结构,不同的异常类型在不存在子父类关系的情况下,谁声明在上面,谁声明在下面都可以。如果多个异常类型满足子父类的关系,则必须将子类声明在父类结构的上面,否则报错。
- catch中异常处理的方式:
- 自己编写输出的语句。
printStackTrace()
:打印异常的详细原因。(推荐)getMessage()
:获取发生异常的原因。
- try中声明的变量,出了try结构之后,就不可以进行调用了。
- try-catch结构是可以嵌套使用的。
4.开发体会:
- 对于运行时异常:开发中,通常就不进行显示的处理了。一旦在程序执行中出现了运行时异常,那么就根据异常的提示信息修改代码即可。
- 对于编译时异常:一定要进行处理,否则编译不通过。
5.finally的使用说明:
5.1finally的理解
- 我们将一定要被执行的代码声明在finally结构中。
- 更深刻的理解:无论try中或catch中是否存在仍未被处理的异常、
retrurn
语句等,finally中声明的语句都一定要被执行。 - finally语句和catch语句是可选的,但是finally不能单独使用。
5.2什么样的代码我们一定要声明在finally中呢?
- 我们在开发中,有一些资源(比如:输入流、输出流、数据库连接、Socket连接等资源),在使用完以后,必须显式的进行关闭操作,否则GC不会自动的回收这些资源。进而导致内存的泄露。
- 为了保证这些资源在使用完以后,不管是否出现了未被处理的异常情况下,这些资源能被关闭。我们必须将这些操作声明在finally中!
6.final、finally、finalize的区别(面试题):
- final 用于修饰变量、方法和类,分别代表不可变、固定不变和方法不可被继承。
- finally 是异常处理的组成部分,用于确保在执行
try-catch
代码块之后,特定代码总是会被执行,即使出现了异常。 - finalize 是 Object 类中的一个方法,用于在垃圾收集器准备回收对象时被调用,允许对象执行一些清理工作,但不应在其中执行耗时操作。