Chp18-异常
概念
程序运行中由代码导致的不正常情况
分类
-
Throwable: 总父类,表示所有不正常情况
-
Error: 错误
- 无法解决也无法提前避免
- 通常由硬件问题|JVM问题|内存问题等导致
-
Exception: 异常
-
可以解决也可以提前避免
-
通常由代码导致
-
分类:
-
RuntimeException: 运行时异常,也成为未检查异常|未检异常等
-
特点: 编译不报错, 运行报错
-
可以选择性处理
-
示例:
java.lang.ArithmeticException: 数学运算异常 java.lang.NullPointerException: 空指针异常 java.lang.ArrayIndexOutOfBoundsException: 数组下标越界异常 java.lang.StringIndexOutOfBoundsException: 字符串下标越界异常 java.lang.IndexOutOfBoundsException: 下标越界异常 java.lang.NumberFormatException: 数据类型转换异常 java.lang.ClassCastException: 类型转换异常 ... 基本来自java.lang包
-
-
非RuntimeException:非运行时异常, 也成为检查异常|已检查异常|已检异常等
- 特点: 编译报错
- 必须处理
- 只要不是运行时异常,就一定是非运行时异常
-
-
异常的产生
-
自然产生: 当JVM运行至有问题的代码时, 会自然报出对应异常
-
手动产生:
throw 异常对象;
-
位置: 方法内部
-
运行: 当程序执行到该语句时, 抛出指定的异常对象, 程序会终止
- 抛出运行时异常对象: 编译不报错,运行再抛出
- 抛出非运行时异常: 在编译时抛出报错
-
使用: 直属作用范围内正下方不可存在其他有效语句
-
程序结束运行的方式:
- 自然结束: 代码运行结束
- 运行到异常
- 在非递归环境下执行到
return;
-
异常的处理
-
throws: 上抛异常, 消极处理
访问修饰符 返回值类型 方法名(形参列表)throws 异常类名1,异常类名2,..{ }
-
原理: 将异常上抛至调用者, 自身不处理异常, 如果调用者也选择上抛未处理异常, 则异常最终会抛至虚拟机, 程序仍然会终止
-
特点: 问题不会被根治, 只能让当前方法暂时规避异常风险
-
使用:
- 上抛父类异常可以兼容处理子类异常对象
- 调用者需要处理的异常类型与方法上抛的声明一致
-
与throw关键字的区别:
- 作用上:
- throw用来抛出制造异常
- throws用来上抛处理异常
- 位置上:
- throw写在方法内
- throws写在方法()与{}之间声明处
- 语法上:
- throw后方为异常对象
- throws后方为异常类名
- 作用上:
public static void main(String[] args)throws Exception { System.out.println("main开始"); method(); System.out.println("main结束"); } public static void method()throws Exception{ System.out.println("method开始"); //抛出一个非运行时异常 throw new IOException(); }
-
-
try-catch: 捕捉并处理, 积极处理
try{ 有可能出现异常的代码 }catch(有可能匹配的异常类型 引用名){ 处理语句 }
-
执行: 当try中的内容发生异常时, catch块会捕捉匹配, 当匹配成功时, 执行对应catch块中的处理语句
-
可以真正解决问题, 程序将不再终止
-
使用:
-
当try中存在非运行时异常时, catch块必须做出对应异常的捕捉, 否则编译报错
-
当try中出现异常, 会立即开始匹配catch块
-
需要为不同的异常提供各自的try-catch
-
catch块可以存在多个
-
catch匹配顺序: 自上而下. 一旦有catch块匹配成功,则剩余catch将不再执行
- 一个try-catch结构至多执行一个catch
-
为了保证匹配一定成功, 通常会在catch的最下方匹配一个Exception
-
父类异常可以匹配子类异常, 必须子类异常下方
-
异常对象的操作:
1. String getMessage(): 获取异常的详细信息 2. void printStackTrace(): 打印输出异常的追栈信息(异常类型+异常的详细信息+异常的触发位置)
-
-
finally
finally{
}
使用
- 位置: 通常写在try-catch的最下方
- 执行特点: 无论如何都会执行, 不受try|catch的影响
- 作用: 通常用来关闭释放资源
- finally可以和try单独结合, finally和catch都无法脱离try块存在
- 当try-catch-finally中出现return语句冲突时, 优先执行finally
自定义异常
- 运行时异常: 继承RuntimeException
- 非运行时异常: 继承Exception
操作
书写有参无参构造, 利用有参构造给父类Throwable
中的detailMessage
详细信息属性赋值, 方便后续调用异常对象的getMessage()
/**
* 自定义运行时异常
*/
public class MyRuntimeException extends RuntimeException{
public MyRuntimeException(){}
public MyRuntimeException(String message) {
super(message);
}
}
/**
* 自定义非运行时异常
*/
public class MyException extends Exception{
public MyException(){}
public MyException(String message) {
super(message);
}
}