首页 专题 文章 代码 归档
Java 异常相关
2020.03.01 19:36 2020.03.01 19:36

1. 异常概述

Java 中的异常处理是处理程序运行错误时的强大机制之一,它可以保证应用程序的正常流程。

首先我们将了解java异常、异常的类型以及受查和非受查异常之间的区别。

什么是异常?

字面意义:异常是一种不正常的情况。

在 java 中,异常是扰乱程序正常流程的事件,它是在程序运行时抛出的对象。

异常基本是不可避免的,人们只能捕获异常,并提供捕获后的方案;

这是因为很多地方都可能发生异常,比如:

  • 网络突然断了,导致某些需要网络的服务无法进行,被抛出异常;
  • 读取某个磁盘下的文件,某天该文件也不见了,此时也会抛出异常;

什么是异常处理?

如上面所说,注入网络断开、文件读取失败等错误,程序必须要考虑到发生这些事情后,下一步如何走?如何进行程序接下来的流程;

因为异常通常会干扰程序的正常流程,而异常处理的核心优势是维护程序的正常流程。如下:

tatement 1;  
statement 2;  
statement 3;  
statement 4;  
statement 5;//发生异常
statement 6;  
statement 7;  
statement 8;  
statement 9;  
statement 10;  

假设你的程序中有10条语句,如果在第5条中出现了一个异常,那么语句6-10将不会继续执行。如果你使用了异常处理,那么语句6-10的部分将正常执行,这就是我们为什么需要在程序中使用异常处理的原因。

2. 异常继承关系

截图-1583061382

1、Error:是程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如说当jvm耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误。

2、Exception::程序本身可以捕获并且可以处理的异常。

3、运行时异常(不受检异常):RuntimeException类极其子类表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求处理异常,比如用空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。

4、非运行时异常(受检异常):Exception中除RuntimeException极其子类之外的异常。编译器会检查此类异常,如果程序中出现此类异常,比如说IOException,必须对该异常进行处理,要么使用try-catch捕获,要么使用throws语句抛出,否则编译不通过。

3. 异常的处理

抛出异常:throw,throws

捕获异常:try,catch,finally


1、抛出异常:throw

throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结 束当前方法的执行。

格式:

throw new 异常类名(参数);

public class Main {
    public static void main(String[] args) {
        System.out.println(div(10, 0));

    }

    public static int div(int a, int b) {
        if (b == 0)
            throw new ArithmeticException("异常信息:除数不能为0");//抛出具体问题,编译时不检测
        return a / b;
    }
}

截图-1583061704

2、声明抛出异常:throws

运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常:

格式:

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2 ... { }

public class Main {
    public static void main(String[] args) throws FileNotFoundException {//Java的异常抛出是一层接一层的
        readFile();// 亦可以使用try catch,捕获该语句,而不是也在方法上throws
    }

    public static int div(int a, int b) {
        if (b == 0)
            throw new ArithmeticException("异常信息:除数不能为0");//抛出具体问题,编译时不检测
        return a / b;
    }

    public static void readFile() throws FileNotFoundException {//在方法上throws
        FileInputStream fileInputStream = new FileInputStream("D://txt.xt");
    }
}

截图-1583061905

3、try代码块

格式:


try {
   ...  //监视代码执行过程,一旦返现异常则直接跳转至catch,
        // 如果没有异常则直接跳转至finally
} catch (SomeException e) {
    ... //可选执行的代码块,如果没有任何异常发生则不会执行;
        //如果发现异常则进行处理或向上抛出。
} finally {
    ... //必选执行的代码块,不管是否有异常发生,
        // 即使发生内存溢出异常也会执行,通常用于处理善后清理工作。
}

接着上面读取文件的例子,我们这里就不再main方法上抛出异常了,而是使用try catch捕获:

public class Main {
    public static void main(String[] args) {
        try {
            readFile();
            System.out.println("没有异常,继续执行");
        } catch (FileNotFoundException e) {
            System.out.println("捕获到了异常,这里要有抛出异常后的逻辑");
            // e.printStackTrace();//此句是打印出异常的堆栈信息
        } finally {
            System.out.println("无论发生异常与否,该句都执行....");
        }
    }
    public static void readFile() throws FileNotFoundException {//在方法上throws
        FileInputStream fileInputStream = new FileInputStream("D://txt.xt");
    }
}

截图-1583062092

4. 自定义异常

在程序开发中,Java自带的异常类,也许并不能较好的描述出我们程序的异常,这时我们可以自定义一些异常类,然后在需要抛出的时候使用throw new xxxx();

1、定义自定义异常类,继承自RuntimeException

该类有一个成员变量,用以保存错误信息,重写get/set方法,以便需要时可获取该信息:

package test12;

public class MyException extends RuntimeException {

    private String message;

    public MyException() {
    }

    public MyException(String message) {
        // super(message);
        this.message = message;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

2、例子使用:

public class Main {
    public static void main(String[] args) {
        try {
            div(12, 0);
        } catch (MyException e) {
            System.out.println(e.getMessage());//打印出我们自定义的异常信息
            //异常信息:除数不能为0
        }
    }

    public static int div(int a, int b) {
        if (b == 0)
            throw new MyException("异常信息:除数不能为0");//抛出具体问题,编译时不检测
        return a / b;
    }
}
本节阅读完毕! (分享
二维码图片 扫描关注我们哟