从方法中 return null 的最佳方法?

Best way to return null from a method?

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

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 的任何其他选项吗?

如果不想抛出异常,想明确处理缺失值的情况,可以return 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
    }
}

有关避免和处理空值的更多信息here

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

如果您不希望出现这种情况,也不希望呼叫者处理它,而只是想满足 "catch or specify" 要求,那么您可以将其包装在未经检查的异常并引发它。

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

Guava 提供 Optional class 正是为了不必 return null

但是,如果您已经 使用 Java 8,请注意,它还带有 Optional class,您可能更喜欢使用那个(为了独立于外部库)。