InetAddress.getLocalHost() 抛出 UnknownHostException

新手上路,请多包涵

我正在不同的操作系统上测试我们的服务器应用程序(编写的 Java),并认为 OpenSolaris (2008.11) 由于良好的 Java 集成,将是最不麻烦的。结果我错了,因为我得到了一个 UnknownHostException

 try {
  computerName = InetAddress.getLocalHost().getHostName();
  if (computerName.indexOf(".") > -1)
    computerName = computerName.substring(0,
        computerName.indexOf(".")).toUpperCase();
} catch (UnknownHostException e) {
  e.printStackTrace();
}

输出是:

 java.net.UnknownHostException: desvearth01: desvearth01
    at java.net.InetAddress.getLocalHost(InetAddress.java:1353)

然而, nslookup desvearth01 返回正确的IP地址, nslookup localhost 返回 127.0.0.1 预期。此外,相同的代码在 FreeBSD 上也能完美运行。 OpenSolaris 有什么我不知道的特别之处吗?

任何提示表示赞赏,谢谢。

原文由 jhwist 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

按照良好的传统,我可以再次回答我自己的问题:

It seems that InetAddress.getLocalHost() ignores the /etc/resolv.conf , but only looks at the /etc/hosts file (where I hadn’t specified anything besides localhost ) .将 IP 和主机名添加到此文件可解决问题,异常消失。


另一个答案几乎是正确的,我从上面得到了提示,我的问题得到了解决……谢谢。

但为了改善这一点,我正在添加逐步更改,这样即使是天真的用户也会有所帮助。

脚步:

  • 打开 /etc/hosts ,条目可能如下所示。
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
   ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

  • 您需要通过任何编辑器在此之上再添加一行,例如 vigedit (例如 <your-machine-ip> <your-machine-name> localhost )。
    192.168.1.73 my_foo localhost

现在,整个文件可能如下所示:

 192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6

  • 只需保存它并再次运行您的 Java 代码……您的工作就完成了。

原文由 jhwist 发布,翻译遵循 CC BY-SA 4.0 许可协议

我使用 NetworkInterface.getNetworkInterfaces() 作为 InetAddress.getLocalHost() 抛出 UnknownHostException 时的后备。这是代码(为清楚起见,没有异常处理)。

 Enumeration<NetworkInterface> iterNetwork;
Enumeration<InetAddress> iterAddress;
NetworkInterface network;
InetAddress address;

iterNetwork = NetworkInterface.getNetworkInterfaces();

while (iterNetwork.hasMoreElements())
{
   network = iterNetwork.nextElement();

   if (!network.isUp())
      continue;

   if (network.isLoopback())
      continue;

   iterAddress = network.getInetAddresses();

   while (iterAddress.hasMoreElements())
   {
      address = iterAddress.nextElement();

      if (address.isAnyLocalAddress())
         continue;

      if (address.isLoopbackAddress())
         continue;

      if (address.isMulticastAddress())
         continue;

      return address.getHostAddress();
   }
}

其他答案编辑 /etc/hosts 文件。这是容易出错的,脆弱的,可能需要 root 访问权限并且不能在所有操作系统上工作。

原文由 Nathan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题