Java学习笔记——异常
异常的原理
异常的结构体系
java.lang.Throwable : 所有异常和错误的父类
|--java.lang.Error:错误,一些严重的错误。如:系统错误,内存溢出等。我们不在代码中对其进行处理
|--java.lang.Exception:异常,需要我们尽可能预知并处理的异常。如:用户输入有误、网络连接中断等。
|--受检异常(编译时异常 checked):编译时对其进行检查,若不对其进行处理,编译不能通过。
|--非受检异常(运行时异常 unchecked):可以保证程序正常运行,一旦发生异常,会在该代码处
生成一个异常对象,然后堆栈式抛出,若不对其进行处理
最终程序终止运行。
异常的处理
Java 中异常的处理采用“抓抛模型”
“抛”:一旦某句代码发生异常,会在该代码处生成一个异常对象,然后以堆栈式抛出【自动抛出/手动抛出】
“抓”:对上述抛出的异常对象进行捕获处理
try{
//可能发生异常的语句
}catch(异常的类型 变量名){
//异常的处理语句
}catch(异常的类型 变量名){
//异常的处理语句
}
……
finally{
//一定执行的语句
}
注意:
①catch 块可以有多个,一旦某个 catch 块的异常类型匹配成功,执行相应语句,其他 catch 块将不再执行
②catch 块可以有多个,若具有子父类关系,必须子上父下
③try-catch 可以嵌套的
④finally 是可选的,一旦写上一定执行,即便有 return 语句
异常处理的常用方法:
printStackTrace() : 打印异常的详细信息
String getMessage() : 返回异常的描述信息
声明抛出异常
异常的处理方式之二:throws 关键字:是异常的处理方式之一,处理方式是将异常抛出,交给调用者做具体的处理
使用在方法的声明处,后跟异常的类型
例如:
public void show() throws FileNotFoundException, IOException{
}
[补充]子类重写方法抛出的异常类型范围不能大于父类被重写方法抛出的异常类型范围
throw 关键字:制造异常 [可以代替 return 语句]
使用在方法体内,后跟异常对象:
例如:
public int div(int a, int b){
if(b == 0){
throw new ArithmeticException("除数不能为零!");
}else{
return a / b;
}
}
throw 不仅可以制造 Java 提供的异常对象,还可以制造自定义异常
自定义异常
自定义异常:
①声明一个类继承一个异常类
(若该类继承的是 RuntimeException 该类为运行时异常,若继承的是 Exception 该类为编译时异常)
②提供有参构造器(通常为 getMessage() 方法设置值)