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 对象的方法/字段
NumberFormatExceptionInteger.parseInt("abc")
ArrayIndexOutOfBoundsExceptionarr[10] 越界
IndexOutOfBoundsExceptionlist.get(10) 越界
ClassCastException(String) someObject 类型不对
ArithmeticException1 / 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 里的惯例,调用方一看就懂。

四、怎么查具体异常的含义

  1. IDE 悬停:鼠标放到红线上,直接看类型。
  2. Ctrl + 点击异常类名:跳到源码,看类注释。
  3. 查 JDK 文档https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html
  4. 直接搜:“Java XxxException 什么情况” —— 搜索引擎比背靠谱。

五、一句话总结

  • 不需要背全,记住 NullPointerExceptionNumberFormatExceptionIndexOutOfBoundsException 这三个最常碰。
  • 编译器会帮你,有受检异常它会强制你处理。
  • IDE 会提示,悬停看红线。
  • 拿不准就 catch Exception,先把功能跑通,回头细化。