异常
总结
整理了 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
方法声明抛出 IOException
,main
方法调用 readFile
时,通过 try - catch
块捕获并处理该异常。