You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在自定义异常中使用空列表而非null?代码优化问询

解决SectionNotFoundException中空列表未正确初始化的问题

首先咱们来梳理下你代码里的核心问题:你写的emptyArrayList()方法确实返回了一个空列表,但你只是调用了它,却没把返回的列表赋值给异常类里的journalList成员变量,所以这个方法相当于白调用了,根本没起到让journalList变成空列表的作用。

接下来给你两种符合需求的解决方案,你可以根据实际场景选择:

方案一:强制异常中的列表始终为空列表

如果你希望不管传入构造方法的列表是什么,异常里的journalList都固定是空列表,可以直接在构造方法里初始化它,不需要额外的方法:

import java.util.ArrayList;
import java.util.List;

public class SectionNotFoundException extends Exception {
    // 用private封装成员变量,提供getter供外部访问
    private final List<Journal> journalList;

    public SectionNotFoundException(List<Journal> journalList) {
        // 直接初始化空的ArrayList,确保永远非null
        this.journalList = new ArrayList<>();
    }

    // 提供getter方法让外部获取列表
    public List<Journal> getJournalList() {
        return journalList;
    }
}

如果不需要后续修改这个列表,也可以用不可变的空列表(性能更好):

this.journalList = Collections.emptyList();

方案二:仅当传入的列表为null时使用空列表

如果你想保留传入的非空列表,只在传入的列表是null时才用空列表,可以做判空处理,同时做防御性拷贝避免外部修改异常内的列表:

import java.util.ArrayList;
import java.util.List;

public class SectionNotFoundException extends Exception {
    private final List<Journal> journalList;

    public SectionNotFoundException(List<Journal> journalList) {
        // 三元运算符判空:如果传入的是null就初始化空列表,否则拷贝传入的列表
        this.journalList = journalList == null ? new ArrayList<>() : new ArrayList<>(journalList);
    }

    public List<Journal> getJournalList() {
        return journalList;
    }
}

额外注意点

  • 自定义异常一般继承Exception(受检异常)或RuntimeException(非受检异常),而不是直接继承Throwable,因为Throwable包含了Error类,通常自定义业务异常不需要继承它。
  • 成员变量建议用private final修饰,确保不可变且封装性良好,通过getter方法暴露给外部。

这样修改后,你在Test2的catch块里就能通过e.getJournalList()拿到非null的空列表了,再也不会出现返回值未使用的问题啦。

内容的提问来源于stack exchange,提问作者invzbl3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:47:32