如何在方法中返回错误?

4
假设有一个方法:
MyClass myMethod(MyClass input){
    //body of method
}

假设我不知道这个方法确切的使用场景。如果输入为空,我应该抛出异常还是返回一个空值?
对于类似下面这样的方法,我也有同样的问题:
void myMethod(MyClass input){
    //body of method
}

如果输入为空,我该什么都不做直接返回还是抛出异常或者说System.error()?
我在我的项目中使用了所有这些方法。由于我的大多数类只有很少的公共方法,所以它们都能很好地工作。

这大多是基于个人意见的问题,因此可能会被关闭。不过,可以查看Martin的《Clean Code》(Java版本)中关于如何处理这些情况的精彩论述。 - Nathaniel Ford
7个回答

1

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


1
如果输入为空,我应该如何决定是抛出异常还是返回空值?
请问,null 是否是有效的输入?如果是,请不要抛出异常,并进行逻辑处理。如果不是,则应该抛出异常。
这里所说的“有效”是指:假设您正在将一些值存储在对象中,其中一些值是可选的。也就是说,用户可能会提供这些值,也可能不会。在这种情况下,null 只对那些字段有效,但对于必填字段,null 是不可接受的。
将类似的思维方式应用到您的问题上,您可能会得出结论。
另一个例子:假设您正在打开一个文件,该方法的输入为 filePath。如果给定的路径为空,则无效,并且应该抛出异常。

1
如果输入为空会在执行代码时出现错误,那么你应该抛出一个异常(例如IllegalArgumentException)。否则,你可以返回null。

0
一般来说,不要在任何地方允许空值。这只会让生活变得更加困难。Java很难遵循这个建议,但你可以尽力而为,利用你所拥有的资源。

0
如果该方法不应该被调用时传入空参数,那么抛出 NullPointerException(简称 NPE)是可以的,因为输入不能为空是前提条件,调用者应该事先验证它。
/** 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;
}

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));

-1
这是一个有争议的问题。我会说考虑问题域并选择最好的使用方式。
无论如何,要为这些输入清楚地记录代码的行为(使用简洁的Javadoc),以便您API的用户不会因意外行为而感到惊讶。

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