异常 : Exception => 例外
异常 : 程序运行过程当中出现的例外情况
Java当中所有问题的体系结构
Throwable [可以被抛出的]
Error Exception
[错误] [异常]
RuntimeException
[运行时异常]
#:Error 和 Exception 的区别?
Error是指由于硬件环境或者系统原因导致的
程序员通过编码无法解决的问题 - 相对较严重
举例:给新建的集合分配空间超过了int的最大值2147483647
Exception是指程序运行过程当中出现的例外而已 - 相对较轻
#:非运行时异常 和 运行时异常 的区别?
非运行时异常 在编译的时候 就要求程序员给出异常的处理方案
否则程序无法通过编译 - 直接继承Exception
运行时异常 在编译的时候不需要给出解决方案 编译就能通过
程序运行时直接体现异常 - 直接继承RuntimeException
#:常见的运行时异常 11种
ArithmeticException => 算术异常
除以0了
NegativeArraySizeException => 负数数组大小异常
初始化数组的时候 元素个数指定的是负数
ArrayIndexOutOfBoundsException => 数组索引值超出边界异常
访问数组的某个元素时 提供的下标索引值超出范围
NullPointerException => 空指针异常
null访问任何属性或者调用任何方法都会导致空指针异常
NumberFormatException => 数字格式异常
将字符串转换成int或者其它类型的时候
提供的字符串包含不合法的内容
StringIndexOutOfBoundsException => 字符串索引值超出边界异常
字符串的charAt() substring() 都需要提供下标索引值
而一旦下标索引值超出范围 就会出现异常
ClassCastException => 类型造型异常
由于强制类型转换的两个类型根本没有关系 转换失败
IllegalArgumentException => 非法参数异常
初始化集合的时候 传入的参数不合法
IndexOutOfBoundsException => 索引值超出边界异常
List集合的get()传入的下标超出了范围
IllegalStateException => 非法状态异常
迭代器光标根本没有指向元素呢就直接调用remove
ConcurrentModificationException => 并发修改异常
使用迭代器遍历集合的过程当中对集合整体进行添加删除操作
#: 为什么要处理异常?
a> 非运行时异常不做处理都没法通过编译
b> 一旦程序运行时出现异常 之后的语句就都不执行了
#: 如何进行异常处理?
1> 抛还上级 throws
用在方法签名的最后
用来表达本方法当中出现指定种类的异常
本方法当中不做处理 抛还给调用的上级处理
(最后抛给java虚拟机)
足以解决a 但无力解决b
2> 自行处理 try catch finally
try{
可能出现异常的语句;
}catch(要捕获的异常类型 异常代号){
要对捕获到的异常进行什么处理
0.
1.得到异常的简要描述信息
System.out.println(异常代号.getMessage());
2.得到异常的详细信息(栈调用轨迹)
异常代号.printStackTrace();
}finally{
无论是否出现异常 最终都要执行的操作
通常是释放和关闭资源的操作;
}
#: 一个try后面可以写多个catch
但是多个catch要先小后大(异常的范围)
#: 如果多种异常 使用相同的方式处理
中间用 | 连接 |(连接符)
#: finally当中永远不应该写return语句
否则try catch当中的return 就都没有意义了
#: finally当中的语句一定执行吗? 不一定
如何不让它执行呢? System.exit(0);
如何在没有异常的情况下主动制造异常出现的场景?
throw
throw new Exception(“异常的描述信息”);
Exception e = new Exception("异常的描述信息");
throw e;
#:如何自定义异常
自己写一个类 继承Exception或RuntimeException
非运行时异常 运行时异常
Plus1: 当类体当中某个成员变量或者静态变量是调用某个有异常声明的方法
来完成赋值的时候 我们不能在类上加throws
也不能直接在类体当中写try catch
此时必须借助初始化块 或者 静态初始化块
在初始化块当中 进行异常处理
Plus2: Java当中所有的方法默认都抛出所有的运行时异常
方法签名最后相当于有一句看不见的throws RuntimeException
所以 如果父类的方法没有抛异常
子类的方法也可以向外抛出多种运行时异常
但是没有意义
Plus3: 如果有多个连续的需要关闭的资源
我们想要无论前面的资源关闭是否正常
后面的资源都要去尝试关闭 那么就得
学会finally当中嵌套try catch
Plus4: try当中定义的变量是一种特殊的局部变量
会在try的大括号执行结束的时候消亡
如果我们想要在下文程序当中还要使用这个变量
则应该把变量的定义写到try的前面 而且给默认值赋值
在try大括号当中 进行重新赋值
Plus5: 在某些场景下 学会使用异常处理的流程分支来代替传统的if else分支