• Java异常机制简介


    什么是异常?

    异常一般是指程序在编译期没有问题,但是在程序运行期出现的错误,一个程序会因为出现异常而终止运行,也就是我们常说的挂掉,在多线程下,异常只会影响所在的线程,对其他线程没有影响。

    Java异常的分类:

    Java是一种面向对象的编程语言,Java把异常也看成是一个对象。Throwable是所有异常的父类,有两个子类继承于他,分别是Exception和Error,Exception是我们经常看到的异常的父类,而Error我们很少遇到过,出现Error这种错误的时候我们是无法通过更改代码解决的,例如虚拟机运行出现错误等。

    Exception在书上被分为运行时异常,和非运行时异常,很好理解,运行时异常也是非检查异常,Java编译器不会去检查他,即使没有try-catch处理,throws抛出,程序还是会编译通过。就是在程序运行的时候会出现错误,由于程序代码不会处理运行时异常,如果出现就会导致程序运行的终止。如下图的空指针异常和数组下标越界异常,是我们代码运行出错导致的,我们可以通过改变代码的结构避免此类异常的出现。


    非运行时异常也叫受检查异常,除了运行时异常及其子类以外,其他的Exception类及其子类都属于受检查异常,如下图的IOException,SQLException。这种异常的特点就是Java编译器会检查他,在程序运行前,如果不加处理,编译器就会提示,程序无法编译运行,要么用try-catch捕获,要么throws抛出。

    Java处理异常的机制:

    Java是一种面向对象的编程语言,同样把异常也用面向对象的思想进行处理,使程序有更好的维护性。

    当程序中的语句可能抛出异常的时候,有两种处理方式:


    说处理方式之前先记住Java异常这里的五个关键字:try,catch,finally,throw,throws

    1. 利用try-catch语句捕获并处理异常

    2. 在出现异常所在的方法声明处通过throws声明抛出异常,这种处理异常方式不太友好。

    第一种利用try-catch语句捕获并处理异常,把可能出现异常的语句放在try语句块中(尝试着运行),catch捕获可能出现的异常,catch语句块中写入处理异常的语句,一般情况下我们在catch中写入处理异常的代码。注意try代码块不能单独出现,后面必须有catch或者finally代码块,在catch和finally代码块共存的时候,finally代码块一定要在catch后面,finally代码块是在最后执行的,例如我们连接数据库操作之后,一般吧资源的关闭操作都写在finally代码块中。在try后面的catch代码块会依次执行,直到捕获到异常。在各个代码块中定义的变量属于局部变量,不能在其他的代码块中使用。

    try {
    //            要出现异常的代码
                throw new IOException();
            } catch (IOException e) {
    //            处理异常语句
            } finally {
    //            最终执行的代码
            }
    这里细说一下finally关键字,finally最终的意思,也就是说finally中的代码最后一定会被执行,编译器确实也是这么做的,不管return写在了finally代码块之前还是之后,finally中的代码一定会被执行完之后再执行return返回,这是一道面试题,考察的就是finally代码块执行的方式。
     public static void print() {
            try {
                System.out.println("try");
                return;
            }finally {
                System.out.println("finally");
            }
        }

    当执行上面的代码输出的是:

    try
    finally

    也就说finally中的代码在return之前执行了

    第二种利用关键字throws声明抛出异常:throws关键字一定是在方法声明的后面,个人认为这种处理异常的方式是很不负责任的行为,如果一个方法中的代码可能出现异常,没有能力来处理这个异常,就要把这个异常抛出,当某个方法调用这个抛出异常的代码的时候,如果还没有处理这个异常那就还要抛出,一级一级的,直到有方法处理了这个异常。

    public void print() throws IOException {
            throw new IOException();
    }

    上面的方法体中抛出异常的语句,抛出的异常对象必须是Thtoeable类或者是其子类

    throw new String("不是异常");

    以上代码不合法,String类不是异常类

    自定义异常:

    有时候我们可能在特定的处理业务上有着自己的一套异常信息,原有的异常类不能满足我们的需求,就需要我们扩展异常,自定义异常。继承Exception

    public class MyException extends Exception {
    
        public MyException(String message) {
            super(message);
        }
    
        public MyException() {
    
        }
    }
    

    使用:

     public static void print() {
            try {
                throw new MyException("除数为0");
            } catch (MyException e) {
                e.printStackTrace();
            }
        }
    调用输出:


    我们平时写异常的代码的时候经常是在catch代码块中用printStackTrace()方法将异常信息输出,其实不是处理异常,只是测试时候可以看到出现了什么异常。很多代码中的异常都是由于书写的逻辑有问题,只要适当改变代码结构,即可避免异常的产生。

  • 相关阅读:
    XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Siberia
    BZOJ5177 : [Jsoi2013]贪心的导游
    BZOJ1482 : [Balkan2017]Cats
    BZOJ5207 : [Jsoi2017]隧道
    XVIII Open Cup named after E.V. Pankratiev. Ukrainian Grand Prix
    线性代数笔记28——复矩阵和快速傅立叶变换
    闲话复数(2)——欧拉公式
    线性代数笔记27——对称矩阵及正定性
    闲话复数(1) | 不现实的虚数 i 为什么虚?它长成什么样?
    资源下载 | 深度学习、机器学习、机器学习实战、统计学习方法、高等数学、线性代数
  • 原文地址:https://www.cnblogs.com/duzhentong/p/7816565.html
Copyright © 2020-2023  润新知