Java进阶之异常
Java进阶之异常
异常类型
- 运行时异常
- 编写代码时没有任何不正常现象,但是运行期间就会出现异常
- 编译时异常(检查性异常)
不正常现象的分支体系
- 错误Error
- 必须解决的,如果不解决程序必然无法继续执行
- StackOverflowError:栈内存溢出错误
- OutOfMemoryError: 堆内存溢出错误
- 异常Exception
- 认为规定的一种不正常异常,就算是出异常,程序也能继续运行
- ArrayIndexOutBoundsExceptio 数组索引越界异常,数组的索引超过了最大的允许范围
- StringIndexOutBoundsException 字符串索引越界异常
- NullPointerException: 空指针异常,对象为null,还要调用其他的属性或方法
- ClassCastException:类的造型异常,造型时,要进行造型的类型和实际类型不相符
- NumberFormatException: 数字格式化异常,通过数字转换方法进行转换时,要转换的元素不是数字类
- 查找异常
- 点出错信息
- 追踪值得来源
- 调试模式
异常的继承结构
- 异常的顶级父类 Exception
- 检查性异常 Exception
- 运行时异常 RuntimeException
如何在程序中避免因为异常导致程序中断
- 异常出现后会导致其后执行的程序全部中断
- 添加校验机制-取决于要面对的异常
- 因为一些不可预知问题导致的程序异常需要对问题本身加入一些有效性验证
- 对关键性问题节点加入有效性验证
- try...catch...finally来保证计算在任何不可预知的情况下出现异常,也不会导致整个系统中断,只中断try中的后续访问
- try...catch...finally不是从根本上解决了异常,而是,当异常产生的时候,为了防止系统中断,降低异常出现后的影响
- 当try语句中,出现多种不同的异常的时候,同一时间,最多只能产生一个异常
- 如果try中产生了未在catch中捕获的异常,程序依旧会中断运行
- 可以通过多个catch语句块对程序的异常进行捕获,保证任何异常都不会中断程序,catch可以无限数量。
- finally,无论try有无异常,或因为异常去掉了catch,finally都会执行
异常的抛出
- throws Exception
- 异常的抛出也算是一种异常处理,不过,这种处理相当于空处理
- 谁调用有异常的方法,谁就要解决异常,或者再次抛出异常
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; public class A { public void a() throws FileNotFoundException{ FileInputStream fileInputStream = new FileInputStream(new File("C://test.txt")); System.out.println("异常出现了么"); } public static void main(String[] args) throws FileNotFoundException{ A a = new A(); a.a(); } }
异常在开发中的使用
- 运行时异常,最好在开始出现的时候解决掉
- 对程序进行try。。。catch时,尽量保证try中只包含必须要处理的程序段
- 程序架构上,越往底层越应该选择throw,越往顶层越选择try。。。catch