#java #http #exception #get #malformedurlexception
#java #http #исключение #получить #исключение malformedurlexception
Вопрос:
Как мне заставить мою программу возвращать исключение MalformedURLException, а не просто общее исключение?
Я создаю простую функцию, которая считывает URL-адрес, введенный пользователем в консоли, и возвращает содержимое с URL-адреса. Мне это нужно, чтобы проверить, является ли URL допустимым URL или это не рабочий URL.
Пример URL-адресов:http://google.com/not-found.html http:/google.com
Я создал два исключения catch, но похоже, что общее исключение всегда возвращается вместо исключения MalformedURLException.
public static String getUrlContents(String theUrl) {
String content = "";
try {
URL url = new URL(theUrl);
//Create a url connection object
URLConnection urlConnection = url.openConnection();
//wrap the url connection a buffered reader
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line;
while((line = bufferedReader.readLine()) != null) {
content = line "n";
}
bufferedReader.close();
} catch (MalformedURLException e) {
System.out.println("The following url is invalid'" theUrl "'");
//logging error should go here
} catch (Exception e) {
System.out.println("Something went wrong, try agian");
}
return content;
}
Комментарии:
1. docs.oracle.com/javase/8/docs/api/java/net /… : Выдает: Исключение MalformedURLException — если протокол не указан, или найден неизвестный протокол, или спецификация равна нулю.
2. Не могли бы вы, пожалуйста, привести пример ввода с нежелательным поведением?
3. @tworogue если я поставлю http:/google.com или google.com/not-found. html Я хочу, чтобы он вызывал исключение MalformedURLException
4. @AhmeeyaGoldman тогда смотрите мой ответ.
Ответ №1:
Во-первых, исключение java.net.MalformedURLException не относится к ресурсу «не найден»:
исключение MalformedURLException открытого класса расширяет исключение IOException
Выдается, чтобы указать, что произошел неверный URL. Либо в строке спецификации не удалось найти разрешенный протокол, либо строка не может быть проанализирована.
Я понимаю, что вы хотите поймать ситуацию, когда URL приводит к не найденному коду возврата (404). Для этого вам необходимо изучить код ответа HTTP.
Самый простой способ — использовать java.net.HttpURLConnection
:
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/HttpURLConnection.html
общедоступный абстрактный класс HttpURLConnection расширяет URLConnection
Соединение URL с поддержкой функций, специфичных для HTTP. Подробности см. в спецификации.
Каждый экземпляр HttpURLConnection используется для выполнения одного запроса, но базовое сетевое подключение к HTTP-серверу может быть прозрачно совместно использовано другими экземплярами. Вызов методов close () для InputStream или OutputStream HttpURLConnection после запроса может освободить сетевые ресурсы, связанные с этим экземпляром, но не оказывает никакого влияния на какое-либо совместно используемое постоянное соединение. Вызов метода disconnect() может закрыть базовый сокет, если постоянное соединение в противном случае бездействует в это время.
Вы можете проверить код ответа, вызвав getResponseCode()
. Если результат меньше 400, вы получили правильный ответ, в противном случае произошла ошибка клиента (4xx) или ошибка сервера (5xx).
Что-то вроде этого:
public static String getUrlContents(String theUrl) {
String content = "";
try {
URL url = new URL(theUrl);
//Create a url connection object
URLConnection urlConnection = url.openConnection();
if (urlConnection instanceof HttpURLConnection) {
HttpURLConnection conn = (HttpURLConnection) urlConnection;
if (conn.getResponseCode() < 400) {
// read contents
} else {
System.out.println(conn.getResponseMessage());
// treat the error as you like
}
} else {
// not a HTTP connection, treat as you like
}
} catch (MalformedURLException e) {
System.out.println("The following url is invalid'" theUrl "'");
//logging error should go here
} catch (Exception e) {
System.out.println("Something went wrong, try agian");
}
return content;
}
Я не проверял код, но я думаю, вы можете получить общую идею.