Как проверить, если URL не существует? - PullRequest
2 голосов
/ 25 октября 2011

Я пытаюсь проверить, существует ли URL, к которому я хочу подключиться, или нет. Вот моя попытка:

try {
    // Connect to the url
    document = Jsoup.connect("http://www.malformedurl.com").get();
    tags = document.select(".tags .tag a");
    num = document.select(".tag .count");
    // Take the wanted data 
    UrlFunctions.UrlParse(tags, num);
} catch (java.net.MalformedURLException e) {
    System.out.println("URL DOESNT EXIST");
}

После этого я не получаю сообщение URL DOESNT EXIST. Какое исключение я должен использовать или что еще я должен сделать?

1 Ответ

3 голосов
/ 25 октября 2011

A MalFormedURLException будет выброшено, только если URL действительно искажен, то есть он не соответствует спецификации URL , а не когда он не существует.Это под прикрытием был брошен конструктором класса java.net.URL.Его javadoc сообщает следующее:

throws

MalformedURLException - если в строке указан неизвестный протокол.

Итакон будет выдан только при использовании, например, "www.malformedurl.com" или "foo://www.malformedurl.com" вместо "http://www.malformedurl.com".

. Чтобы определить, существует ли URL-адрес, лучше выбрать другое решение.Если имя хоста неизвестно, вместо этого вы должны перехватить UnknownHostException:

try {
    document = Jsoup.connect("http://www.malformedurl.com").get();
    // ...
} catch (UnknownHostException e) {
    System.err.println("Unknown host");
    e.printStackTrace(); // I'd rather (re)throw it though.
}

Это не обязательно проблема другого конца, это также может произойти, когда DNS-серверв вашей сети это фальшивка.

Или, чтобы определить, доступен ли IP-адрес, вам нужно перехватить SocketTimeoutException вместо:

try {
    document = Jsoup.connect("http://12.34.56.78").get();
    // ...
} catch (SocketTimeoutException e) {
    System.err.println("IP cannot be reached");
    e.printStackTrace(); // I'd rather (re)throw it though.
}
...