在模板方法中抛 UnsupportedOperationException 是为了强制子类重写关键步骤,避免因默认空实现导致静默失败。父类提供具体方法并抛异常,子类必须覆盖实现业务逻辑,且方法签名需一致。

在模板模式中,子类必须实现的抽象步骤方法如果被父类默认实现为“不支持操作”,就可以用 throw new UnsupportedOperationException() 来明确拒绝调用。
为什么在模板方法中抛 UnsupportedOperationException
模板方法模式定义了算法骨架,把可变行为延迟到子类实现。父类中声明的抽象步骤(如 abstract void doStep())本不该有默认逻辑;但有时为了兼容或强制子类覆盖,会提供一个空实现或占位实现,并主动抛出异常,避免子类忘记重写时静默失败。
典型写法:在父类的默认步骤方法里抛出
父类中不声明该方法为 abstract,而是提供一个具体方法,并直接抛出异常:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public abstract class DataProcessor {
// 模板方法
public final void process() {
loadData();
validateData();
transformData(); // 子类必须重写这个步骤
saveData();
}
<pre class='brush:java;toolbar:false;'>protected void loadData() { /* 默认实现 */ }
protected void validateData() { /* 默认实现 */ }
// 默认实现:明确表示该步骤未被子类支持
protected void transformData() {
throw new UnsupportedOperationException("transformData() must be implemented by subclass");
}
protected void saveData() { /* 默认实现 */ }}
立即学习“Java免费学习笔记(深入)”;
子类正确做法:必须重写并提供实际逻辑
子类只要覆盖该方法,就不会触发异常:
- 重写方法时去掉
throw,加入真实业务逻辑 - 不要调用
super.transformData()(除非你有意延续不支持语义) - 方法签名(名称、参数、返回类型)必须与父类一致
注意事项
- 异常消息建议带上具体方法名和说明,便于调试定位
- 不要在
final或private方法中抛这个异常——子类无法覆盖,就失去了模板模式意义 - 如果该步骤是可选的,考虑用空实现或默认空逻辑,而不是抛异常
- IDE 通常会提示“Method must be overridden”,这是良好设计的信号

















