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