InetAddress.getLocalHost() 抛出 UnknownHostException

2022-08-31 11:31:57

我正在不同的操作系统上测试我们的服务器应用程序(书面Java),并认为由于良好的Java集成,OpenSolaris(2008.11)将是最不麻烦的。事实证明我错了,因为我最终得到了一个未知的HostException

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)

但是,返回正确的 IP 地址,并按预期返回。另外,同样的代码在 FreeBSD 上也能完美地工作。OpenSolaris有什么我不知道的特殊之处吗?nslookup desvearth01nslookup localhost127.0.0.1

任何提示赞赏,谢谢。


答案 1

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

似乎忽略了 ,但只查看文件(除了我没有指定任何内容)。将 IP 和主机名添加到此文件可解决问题,并且异常消失。InetAddress.getLocalHost()/etc/resolv.conf/etc/hostslocalhost


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

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

步骤:

  • 打开 ,这些条目可能如下所示。/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代码...您的工作已完成。

答案 2

我使用NetworkInterface.getNetworkInterfaces()作为InetAddress.getLocalHost()抛出未知HostException时的回退。下面是代码(为清楚起见,没有异常处理)。

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();
   }
}

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


推荐