Java异常有哪几种及其相关内容介绍

发布时间:2023-05-20

Java异常处理详解

一、Java异常简介

Java异常是指在程序运行时发生了不可预期的情况,导致程序无法正常执行的错误。在Java中,异常是以类的形式存在,它们继承自Java标准库中的Exception类或RuntimeException类,其中RuntimeException是一种特殊类型的异常,可以不需要在方法上声明。

二、Java异常的种类

Java中的异常大致可以分为两种类型:受检异常和非受检异常。

1. 受检异常

受检异常是指必需在代码中显式处理的异常,否则编译器就会报错。所有继承了Exception类的异常都是受检异常。在方法的声明中,必须声明会抛出受检异常,否则编译器会报错。在调用抛出受检异常的方法时,需要使用try-catch块进行捕获并处理异常。受检异常包括但不限于:IOExceptionSQLException等。

示例代码:

public void readFile(String fileName) throws IOException {
    File file = new File(fileName);
    BufferedReader reader = new BufferedReader(new FileReader(file));
    String line = null;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
    reader.close();
}

2. 非受检异常

非受检异常是指不需要在方法声明上声明,在编译时也不需要强制处理的异常。非受检异常包括但不限于:NullPointerExceptionArrayIndexOutOfBoundsException等。当遇到这些异常时,程序会默认输出相关的异常信息并停止运行。

示例代码:

public void divide(int a, int b) {
    int result = a / b;
    System.out.println(result);
}

三、Java异常处理方式

1. try-catch语句

try-catch块是一种异常处理方法,用于捕获可能会抛出异常的代码块,并在捕获到异常之后进行相应的处理。

示例代码:

try {
    // 可能产生异常的代码块
} catch (Exception e) {
    // 异常处理代码
} 

2. try-catch-finally语句

try-catch-finally语句是在try-catch语句的基础上,增加了finally语句块,可以保证在程序执行过程中,finally语句块中的代码总是会被执行,即使try-catch代码块中抛出了异常。

示例代码:

FileInputStream fis = null;
try {
    fis = new FileInputStream("myfile.txt");
    // do something
} catch (FileNotFoundException e) {
    // handle the exception
} finally {
    try {
        fis.close();
    } catch (IOException e) {
        // handle the exception
    }
}

3. try-with-resources语句

try-with-resources语句是一种Java 7引入的新特性,可用于自动关闭资源。当使用try-with-resources语句时,可以在try语句括号中声明需要使用的资源,然后在代码块结束时,系统会自动为我们关闭这些资源。

示例代码:

try (FileReader reader = new FileReader("file.txt");
     BufferedReader br = new BufferedReader(reader)) {
    // do something
} catch (IOException e) {
    // handle the exception
}

四、Java异常的抛出及自定义异常

1. 抛出异常

在Java中,异常可以通过throw语句手动触发。当程序执行到throw语句时,会抛出指定的异常,程序会停止运行。

示例代码:

public void divide(int a, int b) throws ArithmeticException {
    if (b == 0) {
        throw new ArithmeticException("divided by zero");
    }
    int result = a / b;
    System.out.println(result);
}

2. 自定义异常

在Java中,可以通过继承Exception类或RuntimeException类来自定义异常。自定义异常类应该继承ExceptionRuntimeException,并且应该在异常类中提供无参构造函数以及一个带有字符串参数的构造函数。

示例代码:

class MyException extends Exception {
    public MyException() {
        super();
    }
    public MyException(String message) {
        super(message);
    }
}
public void doSomething() throws MyException {
    // 做一些可能会抛出自定义异常的事情
    if (somethingWrongHappened) {
        throw new MyException("something wrong happened!");
    }
}

五、Java异常的链式调用

在Java中,当一个异常被抛出并被捕获之后,我们可以通过Throwable类的getCause()方法获取到该异常的原因。这种方式被称为“链式调用”。链式调用可以有效地捕捉多个异常并将它们链接起来,形成更有意义的错误描述信息。

示例代码:

public void doSomething() throws Exception {
    try {
        // 可能产生异常的操作
    } catch (Exception e) {
        throw new Exception("doSomething failed", e);
    }
}

六、总结

本文介绍了Java异常的种类和处理方式,以及如何手动抛出异常和自定义异常。同时也介绍了异常的链式调用。在编写Java程序时,合理处理异常是十分重要的,可以使程序更加健壮和可靠。