我应该使用哪种Java异常?

4
假设我是一个彻底的懒虫,不想花费几十次按键来创建自己的异常类(实际上使用哪个并不是非常重要)。 然而,为了假装我在遵循良好的实践,我想要一个最适合我的情况的预先存在的类。
问题:当我的类的构造函数接收到一个参数对象时,如果该对象不在我在其他地方构建的给定列表中,则需要抛出异常。
哪个异常类适合用于此目的?

作为额外的注释。大多数情况下,最好重用已有的异常而不是创建新的异常。 - OscarRyz
所以我才问。不过有很多子类:http://java.sun.com/javase/6/docs/api/java/lang/Exception.html - Daddy Warbox
5个回答

20

非法参数异常


12

10

在这里,IllegalArgumentException确实是答案,但是我认为您的设计存在问题。 实质上,您的类不变式依赖于某些外部对象的状态,这违反了封装原则。 没有办法确定调用构造函数是否成功,而不需要了解一些其他对象,这会导致混乱和容易被误用的API。

如果您所引用的列表是static final不可修改的列表(请参见java.util.Collections.unmodifiableList()),并且包含在相关类中,则可以在一定程度上缓解此问题,但我仍然不太喜欢它。 更好的方法是将可接受的参数值封装在enum中,这将完全消除异常的需要。 我通常不喜欢从构造函数抛出异常。 如果必须抛出异常,请改用工厂方法。

如果没有任何选项可以消除外部列表的需求,那么您可能需要重新考虑您的设计。


另外,如果他一定要使用这种容易出错的API,那么创建自己的检查异常可能有助于指导API客户端进行适当的编码实践。+1。 - Darron
这是一个私有嵌套内部类。这是我在Java中能够实现的最好封装。 - Daddy Warbox

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更普遍 :)

-2

如果你还没有明白,IllegalArgumentException :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接