如何在方法中返回错误?

时间:2013-02-19 05:30:58

标签: java error-handling

假设有一种方法:

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

假设我不知道这个方法到底在哪里使用。如果输入为null,那么如何判断是否应抛出异常或仅返回空值?

对于类似

的方法,我有同样的问题
void myMethod(MyClass input){
    //body of method
}

如果输入为null,我应该只返回而不执行任何操作或抛出异常或说System.error()吗?

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

7 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

如果输入为null,那么如何判断是否应抛出异常或仅返回空值?

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

这里的有效含义是什么:让我们说你在一个对象中存储了一些值,其中一些是可选的。即用户可能会或可能不会提供这些值。在这种情况下null仅对这些字段有效,但对于必填字段null是不可接受的。

对你的问题运用类似的想法,你可能会得出结论。

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

答案 2 :(得分:1)

如果输入为null将在执行期间在代码中创建错误,则应抛出异常(例如IllegalArgumentException)。否则你可以返回null。

答案 3 :(得分:0)

通常,永远不要在任何地方允许null。它只会让生活变得困难。 Java使得很难遵循这个建议,但是你可以用你所拥有的东西做到。

答案 4 :(得分:0)

如果不希望使用null参数调用该方法,则可以抛出NullPointerException(简称NPE),因为它是输入!= null的前提条件,并且调用者应事先验证它。

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

在不增加程序分支计数的情况下抛出NPE的常用习惯是:

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

在某些情况下,上述检查隐含在代码中:

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

避免实现无提示失败的方法,因为调用者很难知道方法是否失败。相反,返回布尔值。

boolean myMethod(MyClass input){       
   if (input==null) {
       //you may log that the input was null
       return false;
   }
   //...
   return true;
}

答案 5 :(得分:0)

答案是

告诉,不要问

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

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

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

如果您无法控制方法签名,则可以将Expectation作为成员放置在myMethod的拥有类中。

这可以是非常好的阅读:

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

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

fooRepository.findByBar(bar, Expect.atLeast(5));

答案 6 :(得分:-1)

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

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