让我们假设我是一个完全懒惰的流浪汉,我不想投入我自己的异常类所需的几十个击键(它真的不是非常重要的使用它)。但是,假装我在这里遵循良好做法,我想要一个最符合我情况的预先存在的做法。
问题:当我的类的构造函数在其参数中接收到一个在我在别处构建的给定列表中找不到的对象时,我需要抛出一个异常。
哪种异常类适合抛出?
答案 0 :(得分:20)
IllegalArgumentException
答案 1 :(得分:12)
答案 2 :(得分:10)
IllegalArgumentException确实是答案,但我说你的设计有问题。本质上,您的类不变量依赖于某个外部对象的状态,这违反了封装。如果不了解某些其他对象,就无法确定对构造函数的调用是否会成功,从而导致混淆且容易被误用的API。
如果您引用的列表是static final
不可修改的列表(请参阅java.util.Collections.unmodifiableList()
)并包含在相关类中,则此问题会有所缓解,但我仍然不太喜欢它。如果可能的话,更好的是在enum
中封装可接受的参数值,这将完全消除对异常的需要。我通常不喜欢构造函数抛出的异常。如果必须抛出异常,请改用工厂方法。
如果您无法使用无需外部列表的选项,则可能需要重新考虑您的设计。
答案 3 :(得分:0)
如果您不担心课程数量激增,可以针对这种情况延长IllegalArgumentException
。
public class InvalidInstance extends IllegalArgumentException{
private String[] parameter;
public InvalidInstance (String[] param){
this.parameter = param;
}
public String getMessage()
String msg = "YOUR_MESSAGE";
/* I think a string as "The currente object is
invalid for parameter "+cycle for over parameter;*/
msg += super.geTMessage();
return msg;
}
public Constructor(parameter1,...){
String[] param = new String[number_parameters]
if...
throws new InvalidInstance(param);
}
通过这种方式,您可以记录运行异常的所有参数。
这段代码阅读起来不是很漂亮:如果你喜欢非常结构化的代码,你可以使用它。一个简单的IllegalArgumentException
更常见:)
答案 4 :(得分:-2)
万一你没有得到它,IllegalArgumentException:)