目录
Java 异常处理
1. 什么是异常
2. 异常处理的关键字
2.1 try-catch 语句
2.2 多个 catch 块
2.3 finally 块
2.4 throw 和 throws
3. 自定义异常
4. 异常处理的最佳实践
总结与后续
Java 异常处理
在软件开发中,异常处理(Exception Handling)是确保程序稳定性和鲁棒性的重要技术。Java 提供了一套完善的异常处理机制,使开发者能够优雅地应对运行时错误并进行适当的处理。本模块将介绍 Java 的异常体系结构、如何捕获和处理异常、自定义异常以及最佳实践。
1. 什么是异常
异常 是程序运行过程中出现的问题,可能是因为非法的数据输入、文件未找到、网络连接失败等原因。Java 中的异常是对象,表示程序运行期间发生的问题。
Java 中的异常分为以下两类:
-
检查异常(Checked Exception):必须在编译时处理,例如
IOException
、SQLException
。 -
运行时异常(Unchecked Exception):在编译时不要求强制处理,例如
NullPointerException
、ArithmeticException
。 -
错误(Error):表示系统级的严重问题,例如
OutOfMemoryError
,通常程序无法处理这些错误。
2. 异常处理的关键字
Java 提供了以下关键字用于处理异常:
-
try:包含可能会抛出异常的代码块。
-
catch:用于捕获并处理
try
块中抛出的异常。 -
finally:无论是否发生异常,
finally
代码块都会执行,通常用于释放资源。 -
throw:手动抛出一个异常。
-
throws:用于声明一个方法可能抛出的异常。
2.1 try-catch 语句
try-catch 语句用于捕获和处理异常,当 try
块中的代码抛出异常时,控制流会跳转到匹配的 catch
块进行处理。
语法:
try {
// 可能会抛出异常的代码
} catch (ExceptionType e) {
// 处理异常的代码
}
示例:
try {
int result = 10 / 0; // 可能会抛出 ArithmeticException
} catch (ArithmeticException e) {
System.out.println("不能除以零");
}
在这个例子中,由于尝试将 10 除以 0,try
块会抛出 ArithmeticException
,然后 catch
块捕获该异常并输出 "不能除以零"。
2.2 多个 catch 块
一个 try
块可以有多个 catch
块,用于捕获不同类型的异常。
示例:
try {
int[] numbers = {1, 2, 3};
System.out.println(numbers[5]); // 可能会抛出 ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组索引越界");
} catch (Exception e) {
System.out.println("发生了其他异常");
}
在这个例子中,如果数组访问越界,会捕获到 ArrayIndexOutOfBoundsException
并输出相应的信息。
2.3 finally 块
finally 块中的代码无论是否发生异常都会执行,通常用于释放资源,如关闭文件、释放数据库连接等。
示例:
try {
int result = 10 / 2;
System.out.println("结果是: " + result);
} catch (ArithmeticException e) {
System.out.println("不能除以零");
} finally {
System.out.println("执行 finally 块,无论是否发生异常");
}
在这个例子中,无论 try
块是否抛出异常,finally
块中的代码都会执行。
2.4 throw 和 throws
-
throw:用于手动抛出一个异常。
-
throws:用于声明一个方法可能抛出的异常。
示例:
public void checkAge(int age) {
if (age < 18) {
throw new IllegalArgumentException("年龄必须大于 18 岁");
}
}
public void readFile(String fileName) throws IOException {
// 方法声明中使用 throws
FileReader reader = new FileReader(fileName);
}
在 checkAge()
方法中,当 age
小于 18 时,手动抛出 IllegalArgumentException
异常。
3. 自定义异常
在 Java 中,可以创建自定义异常类,以满足应用程序的特定需求。自定义异常类通常继承自 Exception
或 RuntimeException
。
示例:
// 自定义异常类
public class InvalidAgeException extends Exception {
public InvalidAgeException(String message) {
super(message);
}
}
public class Main {
public void validateAge(int age) throws InvalidAgeException {
if (age < 0) {
throw new InvalidAgeException("年龄不能为负数");
}
}
public static void main(String[] args) {
Main main = new Main();
try {
main.validateAge(-5);
} catch (InvalidAgeException e) {
System.out.println(e.getMessage());
}
}
}
在这个例子中,InvalidAgeException
是自定义的异常类,用于处理年龄非法的情况。
4. 异常处理的最佳实践
-
尽量使用具体的异常类型:捕获异常时,尽量捕获具体的异常类型,而不是
Exception
,这样有助于更精确地处理异常。 -
避免过度捕获:不要捕获不必要的异常,尤其是
RuntimeException
,否则可能隐藏程序中的错误。 -
使用 finally 块释放资源:无论是否发生异常,都应该在
finally
块中释放资源,如关闭文件、数据库连接等。 -
记录异常信息:使用日志工具记录异常信息,便于后期调试和分析。
总结与后续
在本模块中,我们学习了 Java 的异常处理机制,包括如何捕获和处理异常、使用 throw
和 throws
关键字手动抛出和声明异常,以及如何编写自定义异常类。掌握异常处理有助于编写健壮和稳定的 Java 程序。
在下一模块中,我们将讨论 Java 中的 集合框架,学习如何使用集合类来存储和操作数据,从而编写出更高效的代码。