Другие ответы дали вам несколько полезных советов, как избежать ошибки. Но я хотел бы попытаться объяснить, как запутано ваше понимание того, что означает ошибка.
Эта строка:
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
, но имеет смысл ограничить содержимое этого блока только теми операторами, которые требуют специальной обработки ошибок.)