文章目录
异常(Exceptions)是 Java 中用于处理程序运行时错误和异常情况的一种机制。异常是一种对象,用于表示发生的错误或异常情况,并提供了一种机制来捕获和处理这些错误,以确保程序的健壮性和可维护性。
try {
// 可能引发异常的代码
int result = 10 / 0; // 这将引发 ArithmeticException
} catch (ArithmeticException e) {
// 处理 ArithmeticException 异常
System.out.println("ArithmeticException caught: " + e.getMessage());
} catch (Exception e) {
// 处理其他异常(一般性的异常处理)
System.out.println("Exception caught: " + e.getMessage());
} finally {
// finally 块中的代码总是执行
System.out.println("Finally block executed");
}
一. 与事件处理
1. 异常与事件处理的相似之处
两者都会打断正常的执行流程,将控制权转交给事件处理程序或异常处理程序。
2. 异常与事件处理的不同之处
异常用于处理非正常的、例外情况,而事件处理通常用于处理预期的事件。
二. 一些典型的异常
- 文件未找到或不可访问。
- 数组被错误地访问(超出边界)。
- 除以零。
- 对空指针进行解引用等。
三. 分类
1. Error 及其子类:
Error 类及其子类表示严重的问题,通常是虚拟机无法解决的问题。这些异常通常不应该被应用程序捕获或处理,因为它们表明了 JVM 或底层系统的内部错误。例如,OutOfMemoryError 是一种 Error,表示内存用尽。
2. RuntimeException 及其子类:
RuntimeException 及其子类是运行时异常,通常是由程序错误、逻辑错误或 API 滥用引起的。这些异常通常不能被合理地预测或从中恢复,应该在开发过程中修复代码问题,而不是捕获这些异常。例如,NullPointerException 是一种运行时异常,由于尝试访问空对象而引发。
3. Unchecked Exceptions:
运行时异常通常被称为未检查异常,因为编译器不会强制要求你捕获或声明它们。这些异常通常表示程序内部错误,无需在方法签名中声明它们。
非检查异常是指在运行时期抛出的异常,程序员不需要显式地去处理它们,但如果不进行处理,这些异常会导致程序终止。非检查异常主要包括 RuntimeException 及其子类,它们通常表示编程错误或逻辑错误,如 NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException 等。
非检查异常常见的异常类包括:
(1)NullPointerException
表示尝试访问一个空对象的属性或调用空对象的方法时抛出的异常。
(2)ArrayIndexOutOfBoundsException
表示尝试访问数组中超出有效索引范围的元素时抛出的异常。
(3)ArithmeticException
表示在算术运算中出现错误时抛出的异常,如除数为 0。
(4)ClassCastException
表示尝试将对象强制转换为不兼容的类型时抛出的异常。
(5)IllegalArgumentException
表示传递给方法的参数值不合法时抛出的异常。
(6)IllegalStateException
表示对象处于不合法的状态时抛出的异常。
(7)NumberFormatException
表示字符串转换为数字时格式错误时抛出的异常。
等等。
4. Checked Exception(其他所有异常):
除了 Error 和 RuntimeException 及其子类之外的所有异常都属于检查异常。这些异常可能在正常操作期间被抛出,并且可以合理地预测和处理。为了处理检查异常,Java 强制要求使用 try-catch 块或在方法签名中声明异常的抛出。
检查异常是指在编译时期强制要求处理的异常,程序在编译时会强制检查是否对这些异常进行了处理或者声明抛出。如果一个方法可能抛出检查异常,则该方法必须使用 try-catch 块或者 throws 关键字来处理这些异常。常见的检查异常包括 IOException、SQLException 等。
检查异常主要包括以下几种常见的异常类:
(1)IOException 及其子类
表示输入输出操作中可能出现的异常情况,如文件不存在、文件读取错误等。
(2)SQLException
表示数据库操作中可能出现的异常情况,如连接数据库失败、执行 SQL 语句错误等。
(3)ClassNotFoundException
表示尝试加载类时找不到类的异常情况。
(4)ParseException
表示解析字符串时遇到错误的异常情况,通常与日期、时间等相关的处理中使用。
等等。
四. try & catch
try {
// 尝试执行可能抛出异常的代码
} catch (ExceptionType1 e1) {
// 捕获 ExceptionType1 类型的异常,并处理
} catch (ExceptionType2 e2) {
// 捕获 ExceptionType2 类型的异常,并处理
} finally {
// 在无论是否发生异常的情况下都会执行的代码,通常用于资源释放或清理操作
}
- try 块:包含了可能会抛出异常的代码。当代码块中发生异常时,异常会被抛出,然后被对应的 catch 块捕获。
- catch 块:用于捕获 try 块中可能抛出的异常。可以有多个 catch 块,每个 catch 块用于捕获不同类型的异常。捕获异常后,可以在 catch 块中进行相应的处理,比如输出错误信息、日志记录或者重新抛出异常。
- finally 块:用于执行清理操作,无论是否发生异常都会执行。通常用于释放资源或者进行清理操作,比如关闭文件流、数据库连接等。无论是否发生异常,finally 块中的代码都会被执行,即使在 try 或 catch 块中有 return 语句也会执行 finally 块。
public class Main {
public static void main(String[] args) {
try {
// 尝试执行可能抛出异常的代码
int result = divide(10, 0);
System.out.println("Result: " + result);
} catch (ArithmeticException e) {
// 捕获 ArithmeticException 异常,并处理
System.out.println("An error occurred: " + e.getMessage());
}
}
public static int divide(int dividend, int divisor) {
// 尝试执行可能抛出异常的代码
return dividend / divisor;
}
}