Java基础 - Java异常
Introduction
Java中,所有异常的公共祖先都是 Throwable,Throwable下有两个子类:Error and Exception。
- Error:表示严重的错误,程序无法处理,比如OutOfMemoryError,StackOverflowError
- Exception:程序本身可以处理的异常,通过Catch捕获。Exception分为两部分:
- Checked Exception:编译时,如果受检查异常没有被 catch 或者 throws 关键字处理的话,就没办法通过编译。包括Exception及其子类,除了RuntimeException。
- Unchecked Exception:编译时不要求捕捉。包括RuntimeException及其子类。比如IndexOutOfBoundsException等
实际开发中,最重要的事情是保证程序运行不会崩溃。我们想要程序出错时不崩溃,而是告知错误发生在哪里,这样才能保证程序稳定的提供服务,因此需要异常机制。如果没有异常机制,则需要多个if-else语句来预测每一个可能出错的操作。
Exception的工作机制
- 抛出异常
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数!");
}
}- 捕获异常
try {
int x = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("除数不能为 0");
}- 声明异常
一个方法内部如果可能出异常,但不想处理,就可以用 throws 声明它可能抛出异常,让调用者来处理。
public void readFile(String path) throws FileNotFoundException {
FileReader reader = new FileReader(path);
}
// 调用者必须处理这个异常,或者调用者的函数继续throws
try {
readFile("test.txt");
} catch (FileNotFoundException e) {
System.out.println("文件没找到!");
}- 自定义异常
// 定义异常类
class AgeTooSmallException extends Exception {
public AgeTooSmallException(String message) {
super(message);
}
}
// 使用它
public void checkAge(int age) throws AgeTooSmallException {
if (age < 18) {
throw new AgeTooSmallException("年龄不能小于18!");
}
}
try {
checkAge(16);
} catch (AgeTooSmallException e) {
System.out.println("错误:" + e.getMessage());
}当异常被抛出时,Java 运行时系统会在当前方法中查找有没有对应的 catch。如果没有,方法就退出,异常被抛给上一级调用者。一直这样“向上传递”,直到找到匹配的 catch。如果一直没有人处理异常,最终程序崩溃。
调用一个带有throws的函数有两种处理方式:
- 使用try-catch捕获异常
- 继续使用throws抛出异常,传递给更上一层
Exception 使用方法
当异常发生后,如果你没处理,Java 会沿着方法调用栈一级一级地回溯,寻找谁能处理。如果当前方法没有找到匹配的 catch 块,方法会立即终止执行,并从调用栈中弹出。然后,异常被传播到上一个调用该方法的方法中。
- 使用多个catch语句
public static void main(String[] args) {
try {
doSomething()
} catch (IOException e) {
System.out.println(e);
} catch (NumberFormatException e) {
System.out.println(e);
}
}JVM在捕获到异常后,会从上到下匹配catch语句,直到找到匹配的语句。
- try-catch-finally
public static void main(String[] args) {
try {
doSomething()
} catch (IOException e) {
System.out.println(e);
} catch (NumberFormatException e) {
System.out.println(e);
} finally {
System.out.println("END");
}
}finally语句,无论是有无异常出现,都会执行,而且是最后执行。
断言
断言(assertion)是一种程序中的调试语句,用来检测某个逻辑条件在运行时是否为真。如果条件为假,程序会抛出 AssertionError 异常,说明程序存在 Bug。
int age = getUserAge();
assert age >= 0 : "年龄不能为负数";
// 如果age < 0,则输出 Exception in thread "main" java.lang.AssertionError: 年龄不能为负数Java基础 - Java异常
http://example.com/2025/07/07/JAVA/java-exception/