程序在运行时期会出现各种突发状况,有的状况可以通过预先设想的方式去处理,但有的情况则会导致该部分代码无法继续运行,有的情况甚至会导致整个程序无法运行,而java给我们提供了异常处理机制,用于处理代码无法继续运行的情况,这就是异常。异常主要是用于解决运行期间问题的,编译期间出现的问题会导致程序无法正常编译,所以在代码生成可执行文件之前就会告警。
一、什么是异常
异常是指各种在编译期间无法发现的并且在运行时可能会导致程序中断的情况,比如我们最经常见到的空指针异常,数组索引越界异常,类型转换异常等等。这些意外情况都会导致程序无法继续运行下去,所以在程序设计之时就需要考虑各种可能出现的情况,并对其进行妥善处理。使程序返回到一种安全的状态,保存用户工作的结果,并以妥善的方式终止程序。java为我们提供了异常处理机制,可以在程序可能出现异常的地方去捕获并且处理该异常情况,使得程序可以妥善的继续运行,在该点的处理方式可能会是继续向上层抛出异常(比如一个方法会出现异常,则在该方法处向调用点抛出异常,由调用点进行处理),也可能是在自身代码块中捕获并处理该异常。
举一个最简单的例子,当我们需要实现一个除法器时,我们预先并不知道传入的除数会为0,因为可能在调用这个方法之前已经做过层层校验,但事实上由于各种我们没想到的情况,最终调用这个方法时,除数果然为0了,这时我们在程序设计时,就需要预先设想到这种情况,然后对这种情况妥善处理:
public class DivZeroTest {
public static void main(String[] args) {
//在主函数中调用除法器,并将除数传为0值
divZero(1,0);
divZero(1,1);
}
public static void divZero(int a, int b){
System.out.println(a/b);
}
上述代码简单实现了一个不会抛出异常的除法方法,运行时则会抛出异常,且下一个除法运算也不会继续执行,说明未经处理的异常是会掐断整个程序的运行的:
这就是一个简单的异常。
二、异常继承结构
java中的异常继承自Throwable类,Throwable有两个子类,分别是Error和Exception,Error表示程序已经无法正常继续执行,已经无法自愈的情况,而Exception则还可以抢救一波。
Error
Error比较常见的就是栈溢出,比如我们定义一个没有出口的递归方法,就会引发栈溢出:
public class StackOverFlowTest {
public static void main(String[] args) {
overFlow(1);
}
publi