8.异常机制
Throwable
所有异常或者错误的父类
常用方法
public void printStackTrace();打印异常的详细信息
public String getMessage();获取发生异常的原因
Error
表示错误,错误产生后程序员不能通过代码的方式纠正,只能事先避免,好比绝症。
Exception
-
概述
表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的
-
单个异常
语法:
try { 可能出现异常的代码 } catch (异常的类型 变量名) { 处理异常的方案 }
注意:
try中已经执行的代码是有效的,仅仅发生异常后的代码不执行,拿异常对象去匹配catch 如果匹配成功则进入catch里进行处理,不能匹配则往上抛给JVM
-
多个异常
如果你的代码是需要细致化处理多个异常,必须要写多个catch,对每一个异常都专业处理
如果仅仅需要粗略处理,可以直接使用一个catch块,这个catch可以使用Exception
-
finally
无论是否有异常,最终都会执行finally代码块,目的是为了释放资源
语法有两种:
try-finally 不会对异常进行处理,会执行finally try-catch-finally 可能处理异常异常,会执行finally
-
异常的抛出
-
throw
作用:方法中的细节出现问题,在方法内部抛出异常对象,告诉方法调用者
语法: throw new Execption("xx出现异常");
-
throws
作用: 在方法上声明可能抛出的异常,告诉方法调用者去处理
语法: throws 异常类型1, 异常类型2...
-
方法重写的异常原则
子类方法抛出的异常要比父类方法抛出的异常小或者相等,不能抛出新的异常
-
-
异常的类别
-
运行时期异常
RuntimeExeption类和RuntimeException的子类.
可处理,可不处理. 可不处理指的是可以不用try-catch/throws,也能编译通过
-
编译时期异常
Exception及Exception子类中除了RuntimeExeption类的类
要求我们必须处理异常(throws/try-catch),不处理,则编译不能通过.
-
-
异常的转型
目的
编译时期异常转运行时期异常
-
保持异常信息的传递
try{ ... }catch(Exception e){ //转成运行时期异常 throw new RuntimeException(e); }
-
自定义异常
-
使用背景
我们开发中,有许多我们不可意料的异常发生,此时系统提供给我们的异常将不能满足开发的需求,就要自定义异常
-
示例代码
//JDK中没有异常可以描述账号已存在,所以需要自定义异常 public class RegistException extends RuntimeException { //用于提供异常信息 public RegistException(String message) { super(message); } //用于异常转型 public RegistException(Throwable cause) { super(cause); } } public static void testException(String name){ if ("admin".equals(name)){ throw new RegistException("账户名字已存在"); } }
-