Exception
:
Exception
表示程序可以捕获并处理的异常。它通常代表程序中的逻辑错误、用户输入错误或其他可预见的异常情况。try-catch
块或者在方法签名中使用 throws
声明)。例如:IOException
, SQLException
。RuntimeException
的子类,如 NullPointerException
, ArrayIndexOutOfBoundsException
。Exception
通常是可以恢复的,程序可以通过适当的处理继续运行。Error
:
Error
表示程序中严重的错误,通常是 JVM(Java 虚拟机)层面的问题,程序无法控制或处理这些错误。它们通常表示系统级别的异常,比如内存不足。OutOfMemoryError
:JVM 内存不足时抛出。StackOverflowError
:由于递归过深导致栈溢出。VirtualMachineError
:JVM 崩溃或资源耗尽时抛出。Error
通常是不可恢复的,即使捕获了错误,也很难恢复程序的正常运行。因此,Error
通常不应该被程序捕获或处理。Throwable
|
+-- Error (如:OutOfMemoryError, StackOverflowError)
|
+-- Exception
|
+-- RuntimeException (如:NullPointerException, IllegalArgumentException)
|
+-- Checked Exception (如:IOException, SQLException)
import java.io.*;
public class Main {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new FileReader("nonexistentfile.txt"));
} catch (FileNotFoundException e) {
System.out.println("File not found, please check the file path.");
}
}
}
在这个例子中,FileNotFoundException
是一个检查型异常,必须处理。程序捕获异常并给出相应提示,从而避免程序崩溃。
public class Main {
public static void main(String[] args) {
try {
recurse(); // 导致 StackOverflowError
} catch (StackOverflowError e) {
System.out.println("Stack overflow error occurred.");
}
}
public static void recurse() {
recurse(); // 递归调用导致栈溢出
}
}
在这个例子中,StackOverflowError
是一个严重的错误,通常不应该被捕获,因为它表示程序的执行环境出现了严重问题。即使捕获了这个错误,程序也很难恢复正常。
Exception
:表示程序中可以处理的异常,通常用于逻辑错误、用户输入错误等情况。它可以通过捕获和处理,使程序继续运行。Error
:表示程序无法处理的严重错误,通常由 JVM 层面的问题引发,如内存不足、栈溢出。一般情况下,Error
不应该被捕获或处理,因为程序很难从这些错误中恢复。理解 Exception
和 Error
之间的区别,有助于编写健壮且可靠的 Java 程序,合理处理程序中的各种异常情况。