URL-объект Java - новый java.net.URL () - PullRequest
4 голосов
/ 07 октября 2011

Я новичок в Java, просто пытаюсь запустить несколько простых программ. У меня есть этот код:

import java.net.*;
import java.io.*;

class example1 {

    public static void main(String args[]){

    try{
        URL hp = new URL("http://www.java2s.com");
        System.out.println("it all worked?");
    }catch (MalformedURLException e){
        System.err.println("New URL failed");
        System.err.println("exception thrown: " + e.getMessage());
    }

    System.out.println(hp.getProtocol());

    }
}

Java-компилятор "не может найти символ: hp", что заставило бы меня поверить, что объект url, hp не создается строкой:

URL hp = new URL("http://www.java2s.com");

Но не должен ли оператор catch сообщать об ошибке?

Я пытался скомпилировать без блоков try-catch, но я получал сообщение об ошибке: «не зарегистрированное исключение MalformedURLException; должно быть перехвачено или объявлено как выброшенное»

Если я удаляю последнюю строку, которая ссылается на hp, программа компилируется и запускается, но просто отображает «все работает?».

Я уверен, что здесь есть простое объяснение, но я не очень хорошо знаю Java. Спасибо

Ответы [ 2 ]

5 голосов
/ 07 октября 2011

Другие ответы дали вам несколько полезных советов, как избежать ошибки. Но я хотел бы попытаться объяснить, как запутано ваше понимание того, что означает ошибка.

Эта строка:

URL hp = new URL("http://www.java2s.com");

делает две вещи одновременно. Он объявляет переменную (которая более широко упоминается компилятором как «символ») с именем hp, которая может указывать на экземпляр URL; и он создает экземпляр URL и заставляет hp указать на него.

Вы интерпретировали ошибку как «объект URL hp не создается». Итак, во-первых, hp не является объектом - это, самое большее, ссылка на объект, и, конечно, это может быть также null, в этом случае это ссылка на ничто. Но символ hp существует в пределах его объявления независимо от того, назначена ли ему ссылка на объект.

Если создание объекта не удалось - то есть, часть оператора new URL ... не удалась - тогда, скорее всего, произошло бы исключение, как вы ожидали. Но даже если по какой-то непонятной причине создание не удалось, но не выдало исключение, вероятным результатом будет то, что hp будет null, и в этом случае действительная попытка разыменования переменной hp приведет к NullPointerException.

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

Проблема в том, что блок try создает собственную область видимости, поэтому объявленные в нем переменные не доступны за пределами блока. Вы получите точно такую ​​же ошибку, если первая строка внутри вашего блока try будет читать просто URL hp;. Как показано в других ответах, решение этой проблемы заключается в объявлении hp вне блока try, чтобы последующая ссылка была действительной. (Это также будет работать для перемещения последней строки в блок try, но имеет смысл ограничить содержимое этого блока только теми операторами, которые требуют специальной обработки ошибок.)

5 голосов
/ 07 октября 2011

Когда вы определяете hp внутри блока try-catch, его видимость находится внутри блока try.Следовательно, вы получаете ошибку компиляции в операторе печати за пределами блока try-catch.

Определите hp перед началом блока try следующим образом: -

URL hp = null;
try{
        hp = new URL("http://www.java2s.com");
        System.out.println("it all worked?");
        System.out.println(hp.getProtocol());
    }catch (MalformedURLException e){
        System.err.println("New URL failed");
        System.err.println("exception thrown: " + e.getMessage());
    }

Для пониманияэто лучше прочитать в разделе 14.4.2 Scope of Local Variable Declarations здесь .

Также для более безопасной и правильной практики кодирования вы должны бросить MalformedURLException, который вы поймали с предложением throw : -

catch (MalformedURLException e){
            System.err.println("New URL failed");
            System.err.println("exception thrown: " + e.getMessage());
            throw new MalformedURLException("Invalid URL!");
        }

Вам также понадобится обновить свой main, чтобы выдать это исключение: -

public static void main(String[] args) throws MalformedURLException

Если вы не сделаете это, ваш код продолжит работув случае некорректного URL!

...