Java 如何在方法中返回错误?

Java 如何在方法中返回错误?,java,error-handling,Java,Error Handling,假设有一种方法: MyClass myMethod(MyClass input){ //body of method } 假设我不知道在哪里可以使用这种方法。如果输入为null,那么如何决定是抛出异常还是只返回null值 对于像这样的方法,我有同样的问题 void myMethod(MyClass input){ //body of method } 如果输入为null,我应该返回而不执行任何操作,还是抛出异常,或者说System.error() 我把这些都用在了我的项目上。

假设有一种方法:

MyClass myMethod(MyClass input){
    //body of method
}
假设我不知道在哪里可以使用这种方法。如果输入为null,那么如何决定是抛出异常还是只返回null值

对于像这样的方法,我有同样的问题

void myMethod(MyClass input){
    //body of method
}
如果输入为null,我应该返回而不执行任何操作,还是抛出异常,或者说System.error()


我把这些都用在了我的项目上。这一切都很好,因为我的大多数类几乎没有公共方法。

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

空输入是一种异常的情况,还是一种合理的正常行为?如果是异常行为,则抛出异常。如果预期发生,考虑返回<代码> null <代码> .< 如果输入为null,那么如何决定是抛出异常还是只返回null值

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

这里valid的意思是:假设您正在对象中存储一些值,其中一些是可选的。i、 e.用户可以提供也可以不提供这些值。在这种情况下,
null
仅对这些字段有效,但对必填字段无效

把类似的想法应用到你的问题上,你可能会得出结论


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

如果输入为null将在执行过程中在代码中产生错误,则应引发异常(例如IllegalArgumentException)。否则,您可以返回null。

如果不希望使用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;
}

这是一个有争议的问题。我会说,考虑问题域,选择最适合使用的。

在任何情况下,都要清楚地记录这些输入的代码行为(使用简洁的Javadoc),这样API的用户就不会对意外行为感到惊讶。答案是

告诉别人,不要问

其思想是将错误处理委托给一个对象,该对象可以决定是返回某个值还是引发异常

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

MyClass myMethod(MyClass input, Expectation whenInputIsNull){
    if(input==null) {
        // might also throw
        return whenInputIsNull.handle();
    }
    //body of method
}
如果您对方法签名没有控制权,那么您可能会将
期望值
作为成员放入所属的
myMethod
类中

这可能是非常好的阅读:

foo.myMethod(input, Expect.nullReturned());
foo.myMethod(input, Expect.throwIllegalArgumentException());
我发现它在与存储库一起使用时非常方便:

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

这在很大程度上是一个基于意见的问题,因此可能会被关闭。但是,请查看Martin的Clean Code,了解一篇关于如何处理这些情况的精彩论文(Java)。