«1. Введение

В этом руководстве мы рассмотрим причину UnknownHostException на примере. Мы также обсудим возможные способы предотвращения и обработки исключения.

2. Когда возникает исключение?

UnknownHostException указывает, что IP-адрес имени хоста не может быть определен. Это может произойти из-за опечатки в имени хоста:

String hostname = "http://locaihost";
URL url = new URL(hostname);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.getResponseCode();

Приведенный выше код выдает исключение UnknownHostException, поскольку locaihost с ошибкой не указывает ни на какие IP-адреса.

Другой возможной причиной возникновения UnknownHostException является задержка распространения DNS или неправильная конфигурация DNS.

Распространение новой записи DNS по всему Интернету может занять до 48 часов.

3. Как это предотвратить?

Предотвратить возникновение исключения лучше, чем обрабатывать его потом. Вот несколько советов по предотвращению исключения:

  1. Double-check the hostname: Make sure there is no typo, and trim all whitespaces.
  2. Check the system’s DNS settings: Make sure the DNS server is up and reachable, and if the hostname is new, wait for the DNS server to catch up.

4. Как с этим справиться?

UnknownHostException расширяет IOException, которое является проверенным исключением. Подобно любому другому проверенному исключению, мы должны либо выдать его, либо окружить блоком try-catch.

Давайте обработаем исключение в нашем примере:

try {
    con.getResponseCode();
} catch (UnknownHostException e) {
    con.disconnect();
}

Рекомендуется закрывать соединение при возникновении UnknownHostException. Большое количество бесполезных открытых подключений может привести к нехватке памяти для приложения.

5. Заключение

В этой статье мы узнали, что вызывает UnknownHostException, как его предотвратить и как с ним справиться.

Как всегда, код доступен на Github.