InetAddress.getLocalHost() throws UnknownHostException

103,454

Solution 1

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

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

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

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

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
Share:
103,454
jhwist
Author by

jhwist

Coding for fun and food. Python, Ruby, Java. Favorite SCM: Perforce.

Updated on February 12, 2022

Comments

  • jhwist
    jhwist over 2 years

    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.

  • septerr
    septerr almost 12 years
    If you encounter permission issues when trying to write to the hosts file, instructions here will help:decoding.wordpress.com/2009/04/06/…
  • Mark Lakewood
    Mark Lakewood about 10 years
    There is also a bug in OS X and java 7, details and workaround here groups.google.com/forum/#!topic/h2-database/DuIlTLN5KOo
  • Marius Soutier
    Marius Soutier almost 10 years
    Setting 127.0.0.1 localhost <hostname> was sufficient for me
  • ctpenrose
    ctpenrose over 9 years
    Found this too late. Coded up a NetworkInterface.getNetworkInterfaces() solution instead.
  • Gray
    Gray over 8 years
    To get your hostname, you can use the hostname command from the terminal.
  • Jan Rasehorn
    Jan Rasehorn about 7 years
    I had a similar issue under SuSE13 with Java8. Adding the host and ip to /etc/hosts helped, but afterwards nslookup <hostname> was not working anymore because of a timeout. So I removed 'localhost' from the end of the line and now nslookup as well as my Java application were working correctly.