一、异常的概念
程序运行总会有出现错误状况的时候,例如:找不到文件、输入值类型不符合、数组下标为负数等,java把这些经常出现的各种意外状况当成对象进行处理。所有异常和错误的超类都是Throwable。
下面是异常的分类
Throwable有两个子类Error、Exception
错误是指合理的应用程序不应该捕获的严重问题,大多数Error都是异常的,虽然ThreadDeath Error是“正常”的,但它也是Error的子类,因为大多数应用程序都不应该尝试捕获它。
异常是指应用程序想要捕获的情况,异常又分为运行时异常和检查异常,检查异常可以通过在方法体添加throws字句,那么在调用该方法时就要求try catch异常,否则编译错误。
异常的一个总体结构图:
常见的异常:
ArrayIndexOutOfBoundsException 数组下标越界异常。当对数组的索引值为负数或大于等于数组大小时抛出
ArithmeticException 算术异常。譬如:整数除零等
NullPointerException 空指针异常。 当对象引用为空,调用对象所属类的非静态方法。
ClassNotFoundException 找不到类异常。
NegativeArraySizeException 数组长度为负异常
ArrayStoreException 数组中包含不兼容的值抛出的异常,例如向对象数组传递错误类型的值
SecurityException 安全性异常
IllegalArgumentException 非法参数异常
二、异常的抛出
异常的抛出通过throws和throw,前者是针对一个方法,后者针对一个对象,具体使用如下:
输出结果:
抛出的异常会交给上级调用者,上级调用者如果不做处理也可以抛出,最终抛给虚拟机都没有处理,程序就会“挂掉”。
三、异常的捕获
异常的捕获使用关键字try和catch,在上面也已经使用过,在try代码块中添加可能会出现异常的代码段,但尽量不要过长,如果try中代码出现异常,catch就会捕获这个异常并在其代码块中进行异常处理。在catch时会传入一个异常对象引用作为参数,通常传入的异常最好是具体的某种异常,也就是说在捕获异常时尽量不要使用捕获全部异常的语句。
还可以在添加finally关键字,表示无论程序是否出现异常,最后都会运行finally块中的代码。
当然凡事都有例外,当出现下面情况时,finally是不会执行
1、在finally语句块中发生了异常。
2、在前面的代码中用了System.exit()退出程序。
3、程序所在的线程死亡。
4、关闭CPU。
四自定义异常
通过继承Exception及其子类可以自定义异常类,最好会选择相近的异常类继承
下面是自定义异常的使用,以及堆栈信息
输出结果:
可根据堆栈信息快速找到异常的源头。