为什么在Java 6中使用InetAddress.getLocalHost()没有问题,但在OSX上升级到Java 7后就失败了?

9

对我来说,它可以正常工作,但在OSX Mavericks上,针对一个特定的客户端,在Java 7下InetAddress.getLocalHost()会失败,尽管在Java 6下可以正常工作,具体异常如下:

java.net.UnknownHostException: rupert: rupert: nodename nor servname provided, or not known
    at java.net.InetAddress.getLocalHost(InetAddress.java:1466)
Caused by: java.net.UnknownHostException: rupert: nodename nor servname provided, or not known
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:894)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1286)
    at java.net.InetAddress.getLocalHost(InetAddress.java:1462)

这是设计上的问题吗?

更新

看起来这是Java 8中已知的一个bug。

https://bugs.openjdk.java.net/browse/JDK-7180557


2
我认为这是环境问题。他们的主机名正在DNS中被查找,但未被找到。在Java 6 VM中可以工作,但显然Java 7的查找机制已经改变。如果我使用“sudo hostname rupert”更改我的主机名,然后运行一些简单的测试代码,我会得到相同的错误。 - Anya Shenanigans
1
+1 给这个评论,确认这是 Java 中已知的一个 bug,在 1.8 版本中已经修复。我可以证实,在我的 Mac OS X 10.10(Yosemite)环境下,使用 Oracle Java 1.7.0_72(截至本文撰写时最新版本)运行此程序会出现报告的异常,但在 Oracle Java 1.8.0_25(截至本文撰写时最新版本)下则如预期一样正常工作。我相信在我升级之前,它在 Mac OS X 10.9(Mavericks)下正常工作。我怀疑升级调整了与网络配置有关的某些非常特定的东西,因为原始报告提到的是 Mavericks 而不是 Yosemite。 - Christopher Schultz
修复是否预期将被倒退到需要 JDK 7 而非 8 的用户那里?我在错误报告中没有看到这一点提到。 - Idan Adar
从那个错误报告中看来,它在7u85中也被修复了,但似乎他们只公开发布了7u79 <叹气>。 - rogerdpack
2个回答

7

将{yourhostname}部分添加到/etc/hosts中。

例如:

127.0.0.1       localhost {yourhostname}

并且问题消失了。

3
你可以通过在终端输入命令“hostname”并查看返回结果来获取你的主机名。 - Gray
终于有一个至少可以解决问题的答案了,谢谢!(作为关注者的一条说明,我相信这与它正在进行某种反向主机名查找有关http://apple.stackexchange.com/q/30552/25085) - rogerdpack

4
我猜您可以在这里找到答案 - 即使那个问题是关于Solaris的,但Mac OS X和Solaris都是Unix操作系统。 这里

是的,你说得对。我想这就引出了一个问题:在Java中如何获取本地IP地址?还有,如何获取MAC地址?因为我使用的是InetAddress address = java.net.InetAddress.getLocalHost(); NetworkInterface ni = NetworkInterface.getByInetAddress(address); - Paul Taylor
如果这是一个重复的问题,你应该投票关闭,而不是在答案中链接到重复的问题。 - bhspencer
即使我不确定它是否真的是重复的?这只是一个猜测,否则我会投票的。 - Robin Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接