InetAddress.getLocalHost() throws UnknownHostException

JavaFreebsdOpensolaris

Java Problem Overview


I am testing our server-application (written Java) on different operating systems and thought that OpenSolaris (2008.11) would be the least troublesome due to the nice Java integration. Turns out I was wrong, as I end up with a UnknownHostException

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

The output is:

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

However, nslookup desvearth01 returns the correct IP address, and nslookup localhost returns 127.0.0.1 as expected. Also, the same code works perfectly on FreeBSD. Is there anything special to OpenSolaris that I am not aware of?

Any hints appreciated, thanks.

Java Solutions


Solution 1 - Java

In good tradition, I can answer my own question once again:

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). Adding the IP and hostname to this file solves the problem and the exception is gone.


Another answer is almost correct and I got hint from above and my problem get resolved...Thanks.

But to improve this, I am adding steps-by-steps changes, so that it will be helpful for even naive users.

Steps:

  • Open /etc/hosts, the entries might look like below.

     127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
     ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
  • You need to add one more line above of this by any editor like vi or gedit (e.g. <your-machine-ip> <your-machine-name> localhost).

     192.168.1.73 my_foo localhost
    

Now, overall file may look like this:

192.168.1.73 my_foo localhost
127.0.0.1    localhost localhost.localdomain localhost4 localhost4.localdomain4
::1          localhost localhost.localdomain localhost6 localhost6.localdomain6
  • Just save it and run again your Java code... your work is done.

Solution 2 - Java

I use NetworkInterface.getNetworkInterfaces() as a fall back for when InetAddress.getLocalHost() throws an UnknownHostException. Here's the code (without exception handling for clarity).

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

Other answers edit the /etc/hosts file. This is error prone, brittle, may require root access and won't work on all OS's.

Solution 3 - Java

On my amazon instance I was having the same issue, there was default DNS configuration issue. So to fix the issue I had done these steps -

> get your host name

$hostname
ip-10-122-16-169

> ping to hostname

$ping ip-10-122-16-169
ping: unknown host ip-10-122-16-169

> cat /etc/hosts file, you will get something like

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

> now you just need to append your host name at the end of the fist line, so when you append it will look like

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ip-10-122-16-169
::1         localhost6 localhost6.localdomain6

> now you're ready to go, to check ping again the same hostname

$ping ip-10-122-16-169
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=255 time=0.018 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=255 time=0.024 ms

Solution 4 - Java

Host lookups on Solaris uses /etc/nsswitch.conf so depending on what the 'hosts:' line says it determines if /etc/hosts, NIS, DNS and/or LDAP should be consulted.

If you only use hosts and DNS you should have this in /etc/nsswitch.conf:

hosts: files dns

The reason nslookup desvearth01 works is because the nslookup command directly consults /etc/resolv.conf. If you want to do a better command line test, use the command:

getent hosts desvearth01

Solution 5 - Java

This errors shows up when I changed the workstation name and tried start Glassfish 2. You also must rename the entry at /etc/hosts, something like this:

127.0.0.1       localhost
127.0.1.1       MyNewName

Solution 6 - Java

Checkout /etc/hostname then put your hostname to hosts file.

Solution 7 - Java

If you see this message than you need set hostname WITH hostname superhost.domain COMMAND!

After this, check which /etc/hosts file contain string like this 127.0.0.1 localhost.

Also, check that command uname -a returns something like this:

> Linux superhost.domain 2.6.38-8-server #42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

NOT LIKE THIS!!!!

> Linux (none) 2.6.38-8-server #42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

Solution 8 - Java

I am having issues around this as well. I need to do further testing, but it looks like NetworkInterface.getNetworkInterfaces() can be more reliable. I think that this does not do the lookup, but just grabs the IP.

I am using it as the 'next best' when the getLocalHost() fails.

Solution 9 - Java

Another option is in this post (in fact, what is in your /etc/sysconfig/network file for your hostname...by changing it to an FQDN name fixes this issue).

https://stackoverflow.com/questions/12159444/java-getlocalhost-unknownhostexception-etc-hosts-file-differs-linux-api

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjhwistView Question on Stackoverflow
Solution 1 - JavajhwistView Answer on Stackoverflow
Solution 2 - JavaNathanView Answer on Stackoverflow
Solution 3 - Javaankit.vishenView Answer on Stackoverflow
Solution 4 - JavaMartinView Answer on Stackoverflow
Solution 5 - JavaJimmyView Answer on Stackoverflow
Solution 6 - Javauser4877680View Answer on Stackoverflow
Solution 7 - JavaPavelView Answer on Stackoverflow
Solution 8 - JavaJonView Answer on Stackoverflow
Solution 9 - JavaDean HillerView Answer on Stackoverflow