Java异常

异常,是Java中非常常用的功能,它可以简化代码,并且增强代码的安全性。


Java异常体系.jpg

关于异常

异常机制,是指程序不正常时的处理方式,具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。

异常的分类

异常类分为两大类型:Error类代表了编译和错误,不允许捕获;Exception类代表了标准Java库方法所激发的异常。Exception类还包含异常类Runtime_Exception和非运行异常类Non_RuntimeException这两个直接子类
运行时异常类对应于编译错误,它是指Java程序在运行时产生的由解释器引发的各种异常。运行异常可能出现在任何地方,且出现频率很高,因此为了避免巨大的系统资源开销,编译器不对异常进行检查。所以Java语言中的运行异常不一定被捕获。出现运行错误往往表示代码有错误,如:算法异常(被0除),下标异常(数组越界)等。
非运行时异常Non_RuntimeException类及其子类的实例,又称为可检测异常。Java编译器利用分析方法或构造方法中可能产生的结果来检测Java程序中是否含有检测异常的处理程序,对于每个可能的可检测异常,方法或构造方法的throws子句必须列出该异常对应的类。在Java的标准包java.lang.util和java.net中定义的异常都是非运行时异常。

异常的特点

JVM捕获并处理未被应用程序捕获的异常

无论是受检异常(Checked Exception)还是运行时异常(Runtime Exception),如果异常没有被应用程序捕获,那么最终这个异常会交由JVM来进行处理,会明显出现下面两个结果:
1. 当前线程会停止运行,异常触发点后面的代码将得不到运行。
2. 异常栈信息会通过标准错误流输出。

处理异常机制

在Java应用程序中,异常处理机制为:抛出异常和捕捉异常。
抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时一次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。

从方法中抛出的任何异常都必须使用throws子句。
捕获异常通过try-catch语句或者try-catch-finally语句实现。
总体来说,Java规定:对于可查异常必须捕获、或者声明抛出。允许忽略不可查的RuntimeException和Error。

抛出异常
程序会在抛出异常的点上停止运行并将异常信息抛出
throws,抛出具体代码中的异常,这种方式编译器都会提示:

public class Student {
    public Student( String name, int age) throws Exception {
        if(age < 1 || age > 150) {
            Exception me = new Exception("年龄超限异常");
            
            throw me;
        }
    }
}
public static void main(String[] args) throws Exception {
    Student student = new Student("姓名", 155);
    System.out.println(student);
}

打印

Exception in thread "main" java.lang.Exception: 年龄超限异常
    at com.day11.Student.(Student.java:9)
    at com.day11.Operation.main(Operation.java:24)

抓取异常
使用 try{} catch{} / try{} catch{} finally{}
在try中放入待执行代码,如果程序正常运行就会执行try中的代码,如果出现异常,就会执行catch中的代码,try后面可以跟多个catch,举例:

ublic static void main(String[] args) {
    int i = 0;
    try {
        //将可能出现异常的代码包裹起来
        int num = 10/i;
    } catch (ArithmeticException e) {
        //对相应类型的异常信息进行处理
        e.printStackTrace(); //打印异常信息
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        //最后一定会执行的代码
        System.out.println("这个体系中最后执行的代码");
    }
}

注意点:1.在接口的实现类中,如果定义的接口抽象方法中没有抛出异常,在重写的抽象方法中是不能通过throws这种方式抛出异常的,因为父类没有抛出异常,子类是不能抛出异常的;2.当通过try catch这种方法抛出异常的时候要注意抛出异常的顺序,异常范围小的放在前面,异常范围大的放在后面,

你可能感兴趣的:(Java异常)