【问题标题】:Which exception should I throw when switching over type? [duplicate]切换类型时应该抛出哪个异常? [复制]
【发布时间】:2021-10-19 11:24:15
【问题描述】:

我有一个类型层次结构,其中类BC 继承抽象类A

我有一个这样的代码块:

if (someVar instanceof B) {
  return "b";
} else if(someVar instanceof C) {
  return "c";
} else {
  throw new Exception("Missing type handling…");
}

我想知道在 Java 中是否有适当的例外,例如 IllegalArgumentException

【问题讨论】:

  • 如果someVar是一个方法参数,那么IllegalArgumentException

标签: java


【解决方案1】:

IllegalArgumentException 很好。

IllegalArgumentException extends RuntimeException

抛出表明一个方法已经被非法或 不恰当的论点。

【讨论】:

  • 另外,有用的消息是个好主意:throw new IllegalArgumentException("Unexpected argument of type " + (someVar == null ? "null" : someVar.getClass().getName()))
  • @VGR 我确实在考虑添加这种信息
  • @thchp 还有适合需要的 UnsupportedOperationException。但是,这两个异常都是运行时异常,这意味着编译器不会强制您尝试捕获。相反,我会创建自己的异常扩展 Exception,这将强制调用者在传递的类型不正确时实现回退。
  • @MatteoNNZ 我的主要目标是检测我在开发过程中添加新类型时忘记添加新的 else if 语句,所以我猜运行时异常是可以的
  • @thchp 那么为什么不是所有的类(B、C 等)都实现了返回 String getSomething() 的相同接口,这样您就不必再担心丰富该方法了?
【解决方案2】:

坚持您提出的问题,IllegalArgumentException 是一个很好的例外。

但是,您似乎没有正确使用类层次结构。如果BC 都扩展了抽象的A,那么我认为A 类应该有一个抽象方法返回您在if 块链中检查的任何内容:

public abstract class A {
    public abstract String getHandling(); //<-- or whatever the correct name is
}

所以BC 可以这样说:

public final class B extends A {
    @Override
    public String getHandling() {
        return "b";
    }
}

public final class C extends A {
    @Override
    public String getHandling() {
        return "c";
    }
}

然后,您在上面部分显示的函数只会声明 someVar 的类型为 A

public void yourFunction(A someVar) {
    return someVar.getHandling();
}

这样,每次有人再次扩展 A 时,您都不必担心实施新的 if

要么是你的新类extends A(在这种情况下它必须提供处理实现),要么只是编译器不会为你接受参数中的对象。

【讨论】:

  • 这是我要写的另一个问题:我遵循域驱动设计,所以我的域类不能依赖于基础设施。而且我需要根据 someVar 是 B 还是 C 来创建实体(这些是我需要映射到实体的域对象)。但是如果 B 和 C 实现该方法,我必须向基础架构添加一个依赖项来实例化实体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多