从方法返回null的最佳方法?

时间:2015-05-16 21:57:19

标签: java guava apache-commons

我需要获取运行代码的机器的主机名。我有这样的方法:

private static final String getHostName() {
    try {
        return InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
    } catch (UnknownHostException ex) {
        logger.logError("error = ", ex);
    }

    // this looks pretty odd to me, are there any better options?
    // like with guava or apache commons?
    return null;
}

这就是我在getHostName()方法

之上使用的方式
private static String findData() {
    String host = getHostName();
    if(host != null) {
        // do something
    }
    // otherwise do something else
}

我的问题是 - 返回null看起来很奇怪。我可以在这里使用Guava或Apache Commons的其他选项吗?

4 个答案:

答案 0 :(得分:6)

如果您不想抛出异常并希望清楚地处理缺少值的情况,则可以返回Optional

private static final Optional<String> getHostName() {
    try {
        return Optional.of(
            InetAddress.getLocalHost().getCanonicalHostName().toLowerCase());
    } catch (UnknownHostException ex) {
        logger.logError("error = ", ex);
        return Optional.absent();
    }
}

客户端代码如下所示:

private static String findData() {
    Optional<String> optionalHost = getHostName();
    if (optionalHost.isPresent()) {
        String host = optionalHost.get();
        // do something
    } else {
        // otherwise do something else
    }
}

有关避免和处理null here的更多信息。

答案 1 :(得分:3)

如果您希望调用者处理这种情况,那么您可以使用Optional(来自Guava或来自JDK 8),或者只是让异常冒泡(有或没有先记录它)。

如果您不希望这种情况发生,并且您不希望呼叫者处理它,但您只是想要满足&#34;捕获或指定&#34;要求,然后你可以将它包装在一个未经检查的异常中并提高它。

答案 2 :(得分:1)

返回null看起来很奇怪,表明你有正确的感觉。永远不会返回null,因为您必须处理返回值(如果x == null ...)。因此抛出异常并将其捕获到适当的位置。如果您不希望它与签名相关,请将其早期包装在运行时异常中并重新抛出它。在那之后抓住它在适当的地方......我已经提到了吗?

答案 3 :(得分:1)

Guava完全提供Optional类,无需返回null

但是,如果您已经使用Java 8,请注意这也带有Optional,您可能更喜欢使用它(为了独立于外部图书馆。)