3

假设有一个方法:

MyClass myMethod(MyClass input){
    //body of method
}

假设我不知道这个方法到底可以在哪里使用。如果输入为空,那么我如何决定是应该抛出异常还是只返回空值?

我对类似的方法有同样的问题

void myMethod(MyClass input){
    //body of method
}

如果输入为空,我应该直接返回而不执行任何操作还是抛出异常或说 System.error()?

我已经将所有这些用于我的项目。这一切都很好,因为我的大多数课程都有很少的公共方法。

4

7 回答 7

1

If input being null will create an error in your code during execution, then you should throw an exception (such as IllegalArgumentException). Otherwise you can return null.

于 2013-02-19T05:55:02.483 回答
1

空输入是一种特殊情况,还是相当正常的行为?如果是异常行为,则抛出异常。如果预计会发生,请考虑返回null

于 2013-02-19T05:38:47.253 回答
1

如果输入为空,那么我如何决定是应该抛出异常还是只返回空值?

问问自己,null输入是有效的吗?如果是,请不要抛出异常并按逻辑处理。如果没有,抛出异常。

这里有效的意思是:假设您将一些值存储在一个对象中,其中一些是可选的。即用户可能会或可能不会提供那里的价值。在这种情况下,null仅对这些字段有效,但对于必填字段null是不可接受的。

将类似的想法应用于您的问题,您可能会得出结论。

另一个例子:假设您正在打开一个文件,其中该方法的输入是filePath. 如果给定的路径为空,则它无效并且应该抛出异常。

于 2013-02-19T05:49:09.273 回答
0

If the method is not expected to be called with a null argument, it is fine to throw a NullPointerException (NPE for short), since it is a precondition that input!=null, and the caller should have verified it beforehand.

/** My method.
  * @param input the input, must not be null.
  */
void myMethod(MyClass input){
  if (input==null) throw new NullPointerException();
  //...
}

A common idiom for throwing NPE, without incrementing your program branch count is:

void myMethod(MyClass input){
  input.getClass(); //NPE if input is null
  //...
}

In some cases, the above check is implicit in the code:

void printLowercase(String input){
  System.out.println(input.toLowerCase());
}

Avoid implementing a method that fails silently, because it makes hard to the caller to know whether the method failed. Instead, return boolean.

boolean myMethod(MyClass input){       
   if (input==null) {
       //you may log that the input was null
       return false;
   }
   //...
   return true;
}
于 2013-02-19T05:55:54.840 回答
0

一般来说,永远不要在任何地方允许 null。它只会让生活变得困难。Java 很难遵循这个建议,但是你可以用你所拥有的做你能做的。

于 2013-02-19T05:34:19.713 回答
0

答案是

告诉,不要问

这个想法是将错误处理委托给一个可以决定是返回某个值还是抛出异常的对象。

如果您可以控制方法签名,那么您就可以做到

MyClass myMethod(MyClass input, Expectation whenInputIsNull){
    if(input==null) {
        // might also throw
        return whenInputIsNull.handle();
    }
    //body of method
}

如果您无法控制方法签名,则可以ExpectationmyMethod.

读起来会很好:

foo.myMethod(input, Expect.nullReturned());
foo.myMethod(input, Expect.throwIllegalArgumentException());

当它与存储库一起使用时,我发现它非常方便:

fooRepository.findByBar(bar, Expect.atLeast(5));
于 2013-02-19T06:57:35.223 回答
-1

这是一个值得商榷的问题。我会说考虑问题域并选择最适合使用的。

在任何情况下,清楚地记录此类输入的代码行为(使用简洁的 Javadoc),以便 API 的用户不会对意外行为感到惊讶。

于 2013-02-19T06:01:06.440 回答