Как выполнить MalformedURLException / 404 не найден - PullRequest
0 голосов
/ 24 марта 2019

Как заставить мою программу возвращать MalformedUrlException, а не просто универсальное исключение?

Я делаю простую функцию, которая считывает URL-адрес, введенный пользователем в консоль, и возвращает содержимое из URL-адреса.Мне нужно, чтобы проверить, является ли URL-адрес действительным или это не рабочий URL-адрес.

Пример URL: http://google.com/not-found.html http: /google.com

Я создал два исключения перехвата, но, похоже, общее исключение всегда возвращается вместо 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 Ответ

0 голосов
/ 24 марта 2019

Во-первых, 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

URLConnection с поддержкой специфичных для 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;
}

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

...