我正在使用Java语言,我有一个方法,如果找到了对象,就应该返回它。
如果没有找到,我应该:
- 返回null
- 抛出异常
- 其他
哪种是最佳实践或习惯用法?
我正在使用Java语言,我有一个方法,如果找到了对象,就应该返回它。
如果没有找到,我应该:
哪种是最佳实践或习惯用法?
或者返回一个选项
Option是一个容器类,强制客户端处理两种情况。Scala有这个概念,请查看它的API。
然后你有像T getOrElse(T valueIfNull)这样的方法在此对象上,它要么返回找到的对象,要么是客户端指定的替代方法。
很不幸,JDK并不一致,当你试图访问资源包中不存在的键时,会抛出未找到异常,而当你从映射中请求值时,如果该值不存在,则返回null。所以我建议修改优胜答案为:如果找到的值可能为空,则在未找到时引发异常,否则返回null。因此,请遵循这个规则,但有一个例外,如果您需要知道为什么找不到值,那么总是引发异常,或者......
没有人提到异常处理中的开销 - 加载和处理异常需要额外的资源,因此除非这是一个真正的应用程序终止或进程停止事件(继续进行会带来更多的伤害),否则我会选择返回一个值,让调用环境自行解释。
我同意这里似乎达成的共识(如果“未找到”是正常可能的结果,则返回null,或者如果情况的语义要求始终找到对象,则抛出异常)。
然而,根据您特定的情况,还有第三种可能性可能是有意义的。您的方法可以在“未找到”条件下返回某种默认对象,从而使调用代码确信它将始终接收到有效对象,而无需进行null检查或异常捕获。
返回一个 null,异常就是你的代码执行了一些意料之外的操作。
异常应该是特殊情况。如果返回null是有效的,则返回null。
Main.java
public class Main {
public static void main(String[] args) {
Example example = new Example();
try {
Example2 obj = example.doExample();
if(obj == null){
System.out.println("Hey object is null!");
}
} catch (Exception e) {
System.out.println("Congratulations, you caught the exception!");
System.out.println("Here is stack trace:");
e.printStackTrace();
}
}
}
Example.java
/**
* Example.java
* @author Seval
* @date 10/22/2014
*/
public class Example {
/**
* Returns Example2 object
* If there is no Example2 object, throws exception
*
* @return obj Example2
* @throws Exception
*/
public Example2 doExample() throws Exception {
try {
// Get the object
Example2 obj = new Example2();
return obj;
} catch (Exception e) {
// Log the exception and rethrow
// Log.logException(e);
throw e;
}
}
}
Example2.java
/**
* Example2.java
* @author Seval
*
*/
public class Example2 {
/**
* Constructor of Example2
* @throws Exception
*/
public Example2() throws Exception{
throw new Exception("Please set the \"obj\"");
}
}
这真的取决于您是否希望找到该对象。如果您遵循异常应用于指示某些异常情况的思想,则:
否则,返回 null。