目录
1. 基本介绍
异常处理就是当异常发生时,对异常处理的方式。
2. 异常处理的方式
(1)try - catch – finally 处理机制
程序员在代码中捕获发生的异常,自行处理。
(2)throws 处理机制
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM。
3. try – catch 异常处理
3.1 基本介绍
Java提供try和catch块来处理异常。try块 用于包含可能出错的代码。catch块 用于处理try块中发生的异常。可以根据需要在程序中有多个try - catch块。
3.2 基本语法
try{
//可疑代码
//将异常生成对应的异常对象,传递给catch块
}catch(异常){
//对异常的处理
}
//可以没有finally,语法是可以通过
3.3 使用细节
①如果try代码块中的一个异常发生了,则异常发生后面的代码不会被执行,直接进入到catch代码块中。
②如果try代码块中的异常没有发生,则顺序执行try代码块的所有代码,不会进入到catch。
③如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)则使用finally{ }代码块。(如果执行catch代码时,和finally的代码冲突,优先执行finally的代码;如果catch代码中有return语句,而finally中有其它代码,则先执行完finally中的代码后,再执行catch的return语句。)
④不管try – catch中是否发生异常,try - catch代码块之后的代码依然正常运行。
运行结果
⑤可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如:Exception 在后,NullPointerException在前。如果发生异常,只会按顺序匹配一个catch。
运行结果
⑥可以使用try - finally搭配,没有catch代码块。这种用法相当于没有捕获异常,因此程序会直接崩溃。主要用于 执行一段代码后,不管是否发生异常,都必须执行某个业务逻辑。
运行结果
3.4 经典应用场景
例:如果用户输入的不是一个整数,就反复提示他输入,直到输入一个整数为止。
4. throws 异常处理
4.1 基本介绍
①如果一个方法(中的语句在执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
②在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
4.2 使用细节
①对于编译异常,程序中必须处理,比如try-catch 或者throws。
②对于运行时异常,程序中如果没有处理,默认就是throws的方式处理(抛出异常)。
③子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型 要么和父类抛出的异常一致,要么为父类抛出异常的类型的子类型(子类不能扩大异常的范围)。
④在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws。
⑤当方法1抛出编译异常后,方法2调用方法1时,也必须处理抛出的异常(如果抛出的是运行异常可以不处理,有默认处理机制)。
5. 自定义异常
5.1 基本介绍
当程序出现了某些“错误”,但该错误信息并没有在 异常信息体系图 中描述处理,这时可以自己设计异常类,用于描述该错误信息。
5.2 设计步骤
①程序员自定义异常类名,继承Exception或RuntimeException。
②如果继承Exception,属于编译异常。
③如果继承RuntimeException属于运行异常,一般继承RuntimeException。
5.3 应用实例
当接收年龄时,要求范围在18-120之间,否则抛出一个异常。
运行结果
5.4 throw 和 throws 的区别
意义 | 位置 | 后面跟的东西 | |
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |