让我们假设我是一个完全懒惰的流浪汉,我不想投入我自己的异常类所需的几十个击键(它真的不是非常重要的使用它).但是,假装我在这里遵循良好做法,我想要一个最符合我情况的预先存在的做法.
问题:当我的类的构造函数在其参数中接收到一个在我在别处构建的给定列表中找不到的对象时,我需要抛出一个异常.
哪个异常类适合抛出?
IllegalArgumentException
准确性获胜者: java.lang.IllegalArgumentException
IllegalArgumentException确实是答案,但我会说你的设计有问题.本质上,您的类不变量依赖于某个外部对象的状态,这违反了封装.如果不知道某些其他对象,就无法确定对构造函数的调用是否会成功,从而导致混淆且容易被误用的API.
如果您引用的列表是一个static final
不可修改的List(请参阅参考资料java.util.Collections.unmodifiableList()
)并包含在相关类中,则此问题会有所缓解,但我仍然不太喜欢它.如果可能的话,更好的是将可接受的参数值封装在一个中enum
,这将完全消除对异常的需要.我通常不喜欢构造函数抛出的异常.如果必须抛出异常,请改用工厂方法.
如果您无法使用无需外部列表的选项,则可能需要重新考虑您的设计.