Как выполнить исключение MalformedURLException / 404 не найдено

#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;
}
  

Я не проверял код, но я думаю, вы можете получить общую идею.