如何在自定义异常中使用空列表而非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
相关产品推荐
相关产品推荐

