异常

总结

整理了 Java 中异常相关的内容,包括异常的概念、异常类型并举例说明、以及异常的处理机制。

简介

概念

在 Java 程序执行过程中,可能会出现一些错误或意外情况,这些情况被称为异常。

后果

异常中断了程序的正常执行流程,如果不加以处理,可能导致程序崩溃。

怎么处理

Java 的异常机制提供了try-catch-finally 的结构来处理异常,使得程序能够更加健壮和稳定。

捕获异常后,程序就不会异常退出了,但try语句内异常点之后的其他代码就不会执行了,执行完catch内的语句后,程序会继续执行catch花括号外的代码。finally 块中的代码总会执行。

详情

异常的类型

检查型异常(Checked Exceptions)

  • 这类异常在编译时被检查。如果一个方法可能抛出检查型异常,调用该方法的代码必须显式地处理这些异常,要么使用 try - catch 块捕获异常,要么在方法声明中使用 throws 关键字声明抛出该异常,让调用者来处理。
  • 常见的检查型异常如 IOException(处理输入输出操作时可能抛出,比如读取不存在的文件)、SQLException(在数据库操作中可能抛出,如 SQL 语句错误)。

非检查型异常(Unchecked Exceptions)

  • 也称为运行时异常(Runtime Exceptions),这类异常在运行时才会被检测到,编译时不会强制要求处理。
  • 通常是由于程序逻辑错误导致的,如 NullPointerException(试图访问空对象的方法或属性)、ArrayIndexOutOfBoundsException(访问数组时使用了非法的索引)。

错误(Errors)

  • 错误表示程序运行时无法恢复的严重问题,通常是由 Java 虚拟机(JVM)或底层系统问题导致的
  • OutOfMemoryError(内存溢出错误,当程序试图分配比可用内存更多的内存时抛出)、StackOverflowError(栈溢出错误,当递归调用没有正确的终止条件时可能发生)。错误一般不由应用程序处理,因为在大多数情况下,应用程序无法从这类问题中恢复。

举例说明常见的异常类型

  • NullPointerException:当应用程序试图在需要对象的地方使用 null 时抛出。例如:
String str = null;
int length = str.length(); // 这里会抛出NullPointerException
  • ArrayIndexOutOfBoundsException:当使用非法的数组索引访问数组时抛出。例如:
int[] numbers = {1, 2, 3};
int value = numbers[3]; // 数组索引最大为2,这里会抛出ArrayIndexOutOfBoundsException
  • ClassCastException:当试图将对象强制转换为不兼容的类型时抛出。例如:
Object obj = new Integer(10);
String str = (String) obj; // 这里会抛出ClassCastException,因为Integer不能转换为String
  • IOException:是所有输入输出异常的基类,在进行文件操作、网络操作等输入输出相关操作时可能抛出。例如,当试图读取一个不存在的文件时:
import java.io.FileReader;
import java.io.IOException;

public class IOExceptionExample {
    public static void main(String[] args) {
        try {
            FileReader reader = new FileReader("nonexistentfile.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • SQLException:在进行数据库操作时,如果 SQL 语句错误、数据库连接问题等,会抛出该异常。例如:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class SQLExceptionExample {
    public static void main(String[] args) {
        try {
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/nonexistentdatabase", "user", "password");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

异常的处理

  • try - catch 块:用于捕获并处理异常。try 块中放置可能抛出异常的代码,catch 块用于捕获并处理特定类型的异常。例如:
try {
    int result = 10 / 0; // 这里会抛出ArithmeticException
} catch (ArithmeticException e) {
    System.out.println("捕获到算术异常: " + e.getMessage());
}
  • finally 块:finally 块通常与 try - catch 块一起使用,无论 try 块中是否抛出异常,finally 块中的代码都会执行。在进行文件操作时,finally 块常用于关闭文件资源,确保资源的正确释放。 例如:
try {
    FileReader reader = new FileReader("example.txt");
    // 文件操作代码
} catch (IOException e) {
    e.printStackTrace();
} finally {
    System.out.println("无论是否发生异常,都会执行这里的代码");
}
  • throws 关键字:当一个方法可能抛出检查型异常,但不想在该方法内部处理时,可以使用 throws 关键字在方法声明中声明抛出该异常,让调用者来处理。例如:
import java.io.FileReader;
import java.io.IOException;

public class ThrowsExample {
    public static void readFile() throws IOException {
        FileReader reader = new FileReader("example.txt");
        // 文件操作代码
    }

    public static void main(String[] args) {
        try {
            readFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,readFile 方法声明抛出 IOExceptionmain 方法调用 readFile 时,通过 try - catch 块捕获并处理该异常。


文章作者: huan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 huan !
  目录