Java/后端
Java异常
关于java里面的异常,怎么分类,查询,和使用
一、异常体系(记住这棵树就够了)
Throwable
├── Error ← 别管,程序救不了(OOM、StackOverflow)
└── Exception
├── RuntimeException ← 非受检异常(编译器不管,运行时才炸)
│ ├── NullPointerException NPE,空指针
│ ├── ArrayIndexOutOfBoundsException 数组越界
│ ├── IndexOutOfBoundsException List 下标越界
│ ├── NumberFormatException 字符串转数字失败
│ ├── ClassCastException 强转类型失败
│ ├── IllegalArgumentException 参数非法
│ ├── ArithmeticException 除以零
│ └── UnsupportedOperationException 不支持的操作
└── 其他(受检异常,编译器强制处理)
├── IOException IO 错误
├── FileNotFoundException 文件找不到
├── SQLException 数据库错误
├── InterruptedException 线程中断
└── ClassNotFoundException 类找不到
核心分两类:
RuntimeException:编译器不强制 catch,你自己小心。日常代码里 catch 的 90% 都是这一类。- 受检异常(checked):编译器强制你 try-catch 或 throws,比如
IOException。
二、日常真正高频的异常(就这几个)
| 异常名 | 触发场景 |
|---|---|
NullPointerException | 调用 null 对象的方法/字段 |
NumberFormatException | Integer.parseInt("abc") |
ArrayIndexOutOfBoundsException | arr[10] 越界 |
IndexOutOfBoundsException | list.get(10) 越界 |
ClassCastException | (String) someObject 类型不对 |
ArithmeticException | 1 / 0 |
IllegalArgumentException | 自己抛,表示参数非法 |
IOException | 文件读写 |
InterruptedException | 线程 sleep/wait 被中断 |
catch 的时候优先 catch 这几个具体的,别一上来就 catch (Exception e)。
三、实战建议
1. 先 catch 具体异常,兜底再 catch 通用
try {
int x = Integer.parseInt(s);
} catch (NumberFormatException e) {
System.out.println("不是合法数字");
}
2. 不知道抛什么时,先 catch (Exception e)
写原型、写 demo 的时候可以偷懒:
try {
// ...
} catch (Exception e) {
System.out.println("出错:" + e.getMessage());
}
但正式代码要细化,因为 Exception 会把所有问题都吞掉,包括你没预料到的 bug。
3. 不要空 catch
try {
// ...
} catch (Exception e) {
// 什么都不写 ❌ 出了问题根本查不到
}
至少 e.printStackTrace() 或打印 e.getMessage()。
4. 自己抛异常用 IllegalArgumentException
参数不合法时:
if (id <= 0) {
throw new IllegalArgumentException("id 必须大于 0");
}
这是 Java 里的惯例,调用方一看就懂。
四、怎么查具体异常的含义
- IDE 悬停:鼠标放到红线上,直接看类型。
- Ctrl + 点击异常类名:跳到源码,看类注释。
- 查 JDK 文档:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html
- 直接搜:“Java XxxException 什么情况” —— 搜索引擎比背靠谱。
五、一句话总结
- 不需要背全,记住
NullPointerException、NumberFormatException、IndexOutOfBoundsException这三个最常碰。 - 编译器会帮你,有受检异常它会强制你处理。
- IDE 会提示,悬停看红线。
- 拿不准就
catch Exception,先把功能跑通,回头细化。