我需要获取运行代码的机器的主机名。我有这样的方法:
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的其他选项吗?
答案 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)