我使用java语言,我有一个方法,如果它被找到,应该返回一个对象。

如果没有找到,我是否应该:

返回null 抛出异常 其他

哪一个是最好的实践或习语?


当前回答

只要它应该返回对象的引用,返回NULL就应该很好。

然而,如果它返回整个该死的东西(就像在c++中,如果你用'return blah;'而不是'return &blah'(或者'blah'是一个指针),那么你不能返回NULL,因为它不是'object'类型。在这种情况下,抛出异常或返回一个没有成功标志集的空白对象是我处理问题的方式。

其他回答

如果null从不表示错误,则返回null。

如果null始终是错误,则抛出异常。

如果null有时是一个异常,那么编写两个例程。一个例程抛出异常,另一个是布尔测试例程,它在输出参数中返回对象,如果没有找到对象,则返回false。

很难滥用Try例程。很容易忘记检查null。

所以当null是一个错误时,你只需要写

object o = FindObject();

当null不是错误时,您可以编写如下代码

if (TryFindObject(out object o)
  // Do something with o
else
  // o was not found

只有在确实是错误时才抛出异常。如果对象不存在是预期行为,则返回null。

否则就是个人喜好的问题了。

如果您正在使用抛出异常的库或其他类,则应该重新抛出异常。这里有一个例子。Example2.java类似于library,而Example.java使用它的对象。Main.java就是一个处理这个异常的例子。您应该向调用端的用户显示有意义的消息和堆栈跟踪(如果需要)。

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。

更重要的是:在代码的其他地方做什么?一致性很重要。

首选返回null——

如果调用者在不检查的情况下使用它,异常就会在那里发生。

如果调用者并没有真正使用它,不要给他一个try/catch块