异常
目录
异常
1 、什么是异常
1.1 哪些不是异常
- 语法错误
- 逻辑错误
1.2 不可预知的非正常的情况
- 例如:网络中断,用户不合适的输入,硬盘已满,操作系统崩溃,内存溢出等
2 、异常的体系结构
2.1 java.lang.Throwable
- 所有异常和错误的超类
- (1)只有这个类型或它子类的对象才能被“抛出”
- (2)只有这个类型或它子类的对象才能被“捕获”
2.2 分为两大类
-
java.lang.Error
-
严重
-
例如:VirtualMachineError
-
StackOverflowError
-
OutOfMemoryError
-
简称OOM
-
如何解决
- 设计合理
- 修改JVM的参数
-
-
-
-
java.lang.Exception
-
运行时异常RuntimeException
- 空指针异常:NullPointerException
- 数组下标越界异常:ArrayIndexOutOfBoundsException
- 类型转换异常:ClassCastException
- 算术异常:ArithmeticException
- 数字格式化:NumberFormatException
-
编译时异常,受检异常
- 在编译阶段必须要求你编写代码去处理,否则编译不通过
- 例如:SQLException,IOException等
-
3 异常的处理机制
3.1 、过程描述
- Java虚拟机会在发生异常的那句代码的位置,创建一个异常的对象,并且抛出,这个时候,它会检测有没有try..catch,如果有对应的catch,那么程序正常运行,如果没有合适的catch,会被往上抛出,如果一路上都没有被catch,最终会导致程序终止运行。
3.2 、两种方式
-
try…catch
-
语法结构
- try{ 可能发生异常的代码 }catch(异常的类型 e){ 捕获该异常后如何处理 }catch(异常的类型 e){ 捕获该异常后如何处理 }catch(异常的类型 e){ 捕获该异常后如何处理 } … finally{ 不管是否发生异常都要执行的代码 }
-
下面的代码
- 执行特点
- (1)如果try中没有异常,那么如果有finally,就执行finally,然后再执行[下面的代码]
- (2)如果try中有异常,try剩下的代码就不执行了,直接去找对应的catch,如果有对应的catch,就执行,然后如果有finally,就执行finally,然后再执行[下面的代码]
- (2)如果try中有异常,try剩下的代码就不执行了,直接去找对应的catch,如果没有对应的catch,然后如果有finally,就执行finally,[下面的代码]就不执行,抛出上级
- 语法特点
- 可能没有catch
- 可能没有finally
- 多个catch异常类型的顺序是"子上父下"
- return和finally并存如何执行
- 如果finally中有return,那么一定是从finally中返回
- 如果finally中没有return,会先执行finally中的语句,然后return结束,但是返回的值是在执行finally之前就赋好值的
-
throws
-
语法结构
- [修饰符] 返回值类型 方法名(形参列表) 抛出的异常列表
-
注意
-
(1)throws后面可以是多个异常,不分顺序
-
(2)如果方法重写
- 重写方法抛出的异常<=被重写方法抛出的异常类型
-
-
4 自定义异常
4.1 、自定义异常一定要继承Throwable或它的子类
-
原因是因为
- (1)只有这个类型或它子类的对象才能被“抛出”
- (2)只有这个类型或它子类的对象才能被“捕获”
4.2 、一般来说声明两个或以上的构造器
- (1)无参构造
- (2)异常类型(String message)
4.3 、都需要序列化
4.4 、自定义异常的对象只能自己new并手动抛出,使用throw关键字
- 当然抛出后,就可以通过throws继续往上抛或使用try..catch处理
5 异常的关键字
5.1 try
- 尝试执行某些代码,看是否发生异常
5.2 catch
- 捕获异常
5.3 finally
- 不管是否发生异常都要执行的代码
5.4 throw
-
手动抛出异常
- 系统预定义异常
- 用户自定义异常
5.5 throws
- 把异常抛出上级
6 异常
6.1 抛
- 1、JVMnew并且抛出
- 2、自己new并通过throw抛出
6.2 处理
- 1、throws继续抛给上级
- 2、当下处理try..catch
6.3 捕获
- try..catch