沉默的争论检查或大吼大叫?

时间:2014-08-13 11:35:03

标签: java

我们对这种方法有所了解 -

public static AbstractAttribute getAttribute(List<AbstractAttribute> attributes, String name) {
    if ((attributes != null) && (name != null) && !name.trim().isEmpty()) {
        for (AbstractAttribute attribute : attributes) {
            if (attribute.getName().equalsIgnoreCase(name)) {
                return attribute;
            }
        }
    }
    return null;
}

先验是否正确? IMO必须有一些例外检查参数逻辑,以防止&#34;客户端&#34;错误使用。 因此,如果出现错误,您必须检查使用此方法的代码,而不是认为一切正常并且&#34; list = null&#34;返回&#34; null&#34;因为即使列表为空,它也不包含某些给定的键

===========更新==== 调用该方法有4种一般情况 -

getAttribute(null,null); // returns null
getAttribute(list,null); // returns null
getAttribute(null,name); // returns null
getAttribute(list,name); //  may return null if not found

所有这些都可以返回null,那么客户端如何理解不同类型的调用之间的区别?他可能错误地使用null参数调用方法 - 并且他收到了null结果,好像一切正​​常并且属性在列表中找不到,但它根本找不到。 嗯......不知道,但我认为必须进行arg检查......

1 个答案:

答案 0 :(得分:1)

应该问自己的是什么,这对开发人员更有用?

AbstractAttribute a = getAttribute(null, "name");

a.something(); // Oh no, null pointer.

AbstractAttribute a = getAttribute(null, "name"); // Oh no, invalid argument exception.

您的Exception 始终应尽可能接近实际问题。如果他们的参数有问题,致命地中断了方法的功能,那么抛出异常!开发人员需要知道他们的错误,责任落在你身上,以确保它尽可能清晰。

修改

是的,你说的是正确的。您的信息需要具体。

public Object myFunction(String something, String somethingElse) {
    // First option - Not so good.
    if(something == null || somethingElse == null) {
        throw new IllegalArgumentException("Invalid parameters. Can not be null");
    }

    // Second option - much better.

    if(something == null) {
        throw new IllegalArgumentException("Something can not be null");
    }

    if(somethingElse == null) {
        throw new IllegalArgumentException("Something else can not be null");
    }
}