Java异常处理
1.异常
- 在Java语言中,将程序执行中发生的不正常情况称为“异常”
2.为什么会有异常处理?
为了避免中断程序的执行流程,Java采用异常处理机制,将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简洁,并易于维护。
3.异常的体系结构
异常的根类:Throwable ,其子类有
-
1)Error: JVM无法解决的严重问题(JVM系统内部错误、资源耗尽等严重情况)
-
2)Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理
4.异常的分类
1.运行时异常:
- 是指编译器不要求强制处置的异常。一般是指编程时的逻辑错误,是程序员应该积极避免其出现的异常。java.lang.RuntimeException类及它的子类都是运行时异常。
2.编译时异常:
- 是指编译器要求必须处置的异常。即程序在运行时由于外界因素造成的一般性异常。编译器要求java程序必须捕获或声明所有编译时异常。
分类:
-
1)运行时异常(非受检异常):RuntimeException
- NullPointerException
- ClassCastException
- ArrayIndexOutOfBoundsException
- ArithmeticException
- ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常
-
2)编译时异常(受检异常):除运行时异常外的所有异常
- IOException:如 FileNotFoundException
- ClassNotFoundException:反射Class.forName(全类名)时,全类名不存在
5.为什么会有运行时异常,不用抛出?它如何自己捕获?
1.RuntimeException运行时异常:
- 能够编译通过的异常( 但运行时会发生异常,会使程序运行终止 )
- 运行时异常即使没有使用try和catch捕获,JVM自己也能捕获
2.非运行时异常:
- 在编译的过程中, Java检测到某段代码[可能]会出现怎样的问题, 需要我们对程序进行预处理,如果不处理, 编译就不允许通过;
- 也就是说,我们必须处理编译时异常,将异常进行捕捉,转化为运行时异常,否则会编译错误
问题:捕获和不捕获异常,程序的运行有什么不同
不捕获异常时的情况:
- RuntimeException类及其子类,这些类的异常的特点是:
即使没有使用try和catch捕获,Java自己也能捕获,并且编译通过 ( 但运行时会发生异常使得程序运行终止 )。- 如果抛出的异常是IOException等类型的非运行时异常,则必须捕获,否则编译错误。也就是说,我们必须处理编译时异常,将异常进行捕捉,转化为运行时异常
6.受检异常的处理方式
1.try-catch-finally
1)try{…}语句块:选定捕获异常的范围
2)catch(Exceptiontype e) 方法:
1. 友情提示
2. 获取异常信息 e.getMessage() ——返回值 String 类型
3. 获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void e.printStackTrace();
3)finally:最终被执行的区域 不管遇到return/break/continue,其都会执行
用于关闭一些资源
注意:
- System.exit(0);系统退出时,finally不执行
- try异常处理代码块,如果异常被catch处理,则程序依旧会继续执行
try{
...... //可能产生异常的代码
}
catc