Java泛型不能直接与异常类结合,禁止定义泛型异常类;规范做法包括:泛型方法中将受检异常包装为语义明确的运行时异常;泛型类中用Class<? extends Throwable>参数间接支持异常类型;集合操作需预防空值、越界等异常;自定义异常虽不泛型,但可携带泛型上下文信息。

泛型方法中统一处理受检异常
泛型方法常用于封装通用逻辑(如解析、转换、IO操作),若内部可能抛出 受检异常(如 IOException、ParseException),不应让调用方被迫写冗长的 try-catch,而应统一包装为运行时异常,或声明抛出:
- 推荐方式:将受检异常转为自定义运行时异常(保持语义明确)
- 示例:
public <T> T parse(String input, Class<T> type) throws IllegalArgumentException,内部对type == null或不支持类型抛出IllegalArgumentException - 避免裸 throw new RuntimeException("xxx") —— 丢失上下文,应包装原异常:
throw new DataConversionException("解析失败", e)
泛型类中异常参数化需绕过类型擦除限制
泛型类本身不能带异常类型参数,但可通过以下方式间接支持异常多样性:
- 用
Class<? extends Throwable>作为方法参数,动态指定期望的异常类型(适用于工厂、断言等场景) - 示例:
public <E extends Throwable> void expect(Class<E> exType) throws E,配合反射或预设策略触发对应异常 - 注意:运行时无法校验
exType是否真被抛出,仅作语义提示;实际抛出仍需throw exType.getDeclaredConstructor().newInstance()等反射操作(慎用)
泛型集合操作中预防常见异常
泛型极大降低了 ClassCastException 风险,但仍需防范因空值、越界、并发等引发的运行时异常:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 对泛型集合做
get(index)前,先检查index < list.size() && index >= 0,而非依赖ArrayIndexOutOfBoundsException的默认行为 - 使用
Optional<T>包装可能为空的泛型返回值(如Optional<String> findFirst()),避免上层出现NullPointerException - 多线程环境下操作泛型集合,优先选
CopyOnWriteArrayList<T>或加锁,而非依赖异常兜底
自定义异常不泛型,但可携带泛型信息
虽然 MyException<T> 不合法,但你可以让异常持有泛型相关的上下文数据:
立即学习“Java免费学习笔记(深入)”;
- 定义字段如
private final String expectedType;、private final Object actualValue; - 构造器接受泛型实例或类型名:
new TypeMismatchException("Expected Integer, got String", "Integer", "abc") - 日志或调试时能清晰反映泛型场景下的失败原因,提升排查效率

















