14 Error 与 Exception —— 异常分类与处理策略

Error 与 Exception ------ 异常分类与处理策略

适用版本: JDK 8 难度等级: 基础 核心概念: 受检/非受检异常、Error 体系、异常设计原则


一、Java 异常体系全景图

javascript 复制代码
                       Throwable
                           │
            ┌──────────────┴──────────────┐
            │                             │
          Error                       Exception
            │                             │
    ┌───────┼───────┐              ┌──────┴──────┐
    │       │       │              │             │
OutOfMemory  ...  StackOverflow  RuntimeException  IOException ...
  Error            Error          │
                           ┌──────┼──────┐
                           │      │      │
                      NullPointer ...  IllegalArgumentException
类型 含义 处理策略
Error JVM 层面的严重问题 不应捕获,应让程序终止
RuntimeException 编程错误(非受检) 修复代码而非捕获
受检异常 可预见的业务异常 必须 try-catch 或 throws

二、Error 类

java 复制代码
public class Error extends Throwable {
    public Error()                                    { super(); }
    public Error(String message)                      { super(message); }
    public Error(String message, Throwable cause)     { super(message, cause); }
    public Error(Throwable cause)                     { super(cause); }
}

常见 Error 子类

Error 类型 含义 典型场景
OutOfMemoryError 堆内存耗尽 内存泄漏、超大对象
StackOverflowError 栈深度超限 无限递归
NoClassDefFoundError 运行时找不到类 编译后 jar 被移除
VirtualMachineError JVM 内部错误 极少遇到
java 复制代码
public class ErrorDemo {
    public static void main(String[] args) {
        // StackOverflowError
        try {
            recursive(0);
        } catch (StackOverflowError e) {
            System.out.println("栈溢出!深度过大");
        }

        // 模拟 OutOfMemoryError
        // byte[][] arrays = new byte[Integer.MAX_VALUE][];
    }

    static void recursive(int depth) {
        recursive(depth + 1);
    }
}

三、Exception 类

java 复制代码
public class Exception extends Throwable {
    public Exception()                                 { super(); }
    public Exception(String message)                   { super(message); }
    public Exception(String message, Throwable cause)  { super(message, cause); }
    public Exception(Throwable cause)                  { super(cause); }
}

3.1 受检异常 vs 非受检异常

java 复制代码
// 受检异常:编译器强制处理
public class CheckedExceptionDemo {
    public static void readFile() throws java.io.IOException {
        throw new java.io.IOException("文件不存在");
    }

    public static void main(String[] args) {
        try {
            readFile();
        } catch (java.io.IOException e) {
            System.err.println("I/O错误: " + e.getMessage());
        }
    }
}

// 非受检异常:编译器不强制
public class UncheckedExceptionDemo {
    public static void divide(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("除数不能为零");
        }
        System.out.println(a / b);
    }

    public static void main(String[] args) {
        divide(10, 2);   // OK
        // divide(10, 0); // 抛 IllegalArgumentException
    }
}

四、自定义异常最佳实践

java 复制代码
/**
 * 业务异常基类------统一异常体系
 */
public class BusinessException extends RuntimeException {
    private final String errorCode;
    private final transient Object[] args;

    public BusinessException(String errorCode, String message, Object... args) {
        super(message);
        this.errorCode = errorCode;
        this.args = args;
    }

    public String getErrorCode() { return errorCode; }
    public Object[] getArgs()    { return args; }

    public static BusinessException of(String errorCode, Object... args) {
        return new BusinessException(errorCode, format(errorCode, args), args);
    }

    private static String format(String code, Object... args) {
        return "[" + code + "] " + java.util.Arrays.toString(args);
    }

    public static void main(String[] args) {
        throw BusinessException.of("USER_001", "userId", 12345);
    }
}

五、面试要点

问题 关键要点
Error 是否应该捕获 通常不应捕获,OOM/StackOverflow 无法恢复
RuntimeException 和 Exception 区别 RuntimeException 是非受检异常,不强制处理
自定义异常选哪个父类 业务异常继承 RuntimeException,减少代码污染
相关推荐
专业程序开发源1 分钟前
springboot高校学生社团管理系统74810-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
励志不掉头发的内向程序员7 分钟前
【LibreCAD 2D架构】从鼠标点击到屏幕像素:LibreCAD绘图架构全链路解析之整体架构与源码组织
后端
专业程序开发源1 小时前
springboot生命故事书制作小程序65290-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·小程序·课程设计
AINative软件工程1 小时前
LLM Prompt Registry 工程实践:集中管理 Prompt,让模型调用不再散落在代码各处
后端·python·llm
IT_陈寒2 小时前
SpringBoot自动配置的坑我帮你踩过了
前端·人工智能·后端
vx_Biye_Design2 小时前
springboot角色扮演服务平台65161-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·spring·课程设计
vx_Biye_Design2 小时前
springboot咖啡厅顾客点单管理系统12080-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
专业程序开发源2 小时前
flask动漫推荐系统32319-计算机课程设计、毕业设计
java·spring boot·后端·django·flask·php·课程设计
FYKJ_20102 小时前
springboot手工蜀绣在线销售系统60947-计算机课程设计、毕业设计
java·spring boot·后端·python·mysql·spark·课程设计
vx_Biye_Design2 小时前
springboot老年人用药智能管理系统38605-计算机课程设计、毕业设计
java·spring boot·后端·python·django·课程设计·express