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

Java 从方法返回null的最佳方法?,java,guava,apache-commons,Java,Guava,Apache Commons,我需要得到运行代码的机器的主机名。我有这样一种方法: private static final String getHostName() { try { return InetAddress.getLocalHost().getCanonicalHostName().toLowerCase(); } catch (UnknownHostException ex) { logger.logError("error = ", ex); }

我需要得到运行代码的机器的主机名。我有这样一种方法:

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;
}
private static String findData() {
    Optional<String> optionalHost = getHostName();
    if (optionalHost.isPresent()) {
        String host = optionalHost.get();
        // do something
    } else {
        // otherwise do something else
    }
}
这就是我使用上述getHostName方法的方式


我的问题是,返回null在我看来很奇怪。我在这里可以使用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;
}
private static String findData() {
    Optional<String> optionalHost = getHostName();
    if (optionalHost.isPresent()) {
        String host = optionalHost.get();
        // do something
    } else {
        // otherwise do something else
    }
}

有关避免和处理null的详细信息。

如果不希望引发异常,并且希望清楚地处理缺少值的情况,则可以返回

客户端代码如下所示:

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

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

如果您希望调用方处理此情况,那么您可以使用来自Guava或JDK 8的Optional,或者干脆让异常冒泡,先记录或不记录它


如果您不希望出现这种情况,也不希望调用方处理它,但您只是试图满足catch或specify要求,那么您可以将其包装在未经检查的异常中并引发该异常。

如果您希望调用方处理这种情况,那么您可以使用来自Guava或JDK 8的Optional,或者干脆让异常冒泡起来,不管是否先记录它


如果您不希望出现这种情况,也不希望调用方处理它,但您只是试图满足catch或specify要求,那么您可以将其包装在未经检查的异常中并引发该异常。

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

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

Guava提供这个类的目的正是为了不必返回null

但是,如果您已经在使用Java 8,请注意,它还附带了一个类,为了独立于外部库,您可能更愿意使用该类。

Guava提供该类正是为了不必返回null


但是,如果您已经在使用Java 8,请注意,它还附带了一个类,为了独立于外部库,您可能更愿意使用该类。

冒泡异常有什么问题?嗯,有时候您不想冒泡异常!冒泡异常有什么不对?嗯,有时候你不想冒泡异常!谢谢你的建议。我可以在getHostname方法中使用Optional而不是在findData方法中使用吗?现在它更有意义了。还有,我的findData方法会是什么样子?将有一些变化,以获取可选的数据,对吗?感谢您的建议可选。我可以在getHostname方法中使用Optional而不是在findData方法中使用吗?现在它更有意义了。还有,我的findData方法会是什么样子?将进行一些更改以从可选位置获取数据,对吗?