Конструкторы могут выдать исключения в Java?

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

то, Что зафиксировало его для меня, печатало мой домен заглавными буквами. Строчное доменное имя никогда не будет соединяться. Верхний регистр соединяется каждый раз. Странный.

222
задан Mahmoud Hossam 16 February 2012 в 09:47
поделиться

5 ответов

Да, конструкторы могут бросать исключения. Обычно это означает, что новый объект немедленно подлежит сборке мусора (хотя, конечно, он может не собираться некоторое время). Однако «наполовину сконструированный» объект может остаться, если он стал видимым ранее в конструкторе (например, назначив статическое поле или добавив себя в коллекцию).

Одна вещь, о которой следует быть осторожными. генерирование исключений в конструкторе: поскольку вызывающий (обычно) не имеет возможности использовать новый объект, конструктор должен быть осторожен, чтобы не получить неуправляемые ресурсы (дескрипторы файлов и т. д.), а затем выбросить исключение, не выпуская их. Например, если конструктор пытается открыть FileInputStream и FileOutputStream , и первый успешен, а второй терпит неудачу, вы должны попытаться закрыть первый поток. Это становится сложнее, если это конструктор подкласса, который, конечно, генерирует исключение ... все это становится немного сложнее. Это не часто проблема, но стоит задуматься.

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

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

349
ответ дан 23 November 2019 в 04:01
поделиться

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

Следующее взято из Руководства по безопасному кодированию 2.0 .

Частично инициализированные экземпляры неокончательного класса можно получить через атаку финализатора. Злоумышленник отменяет защищенный метод finalize в подклассе и пытается создать новый экземпляр этого подкласса. Эта попытка не удалась (в приведенном выше примере проверка SecurityManager в конструкторе ClassLoader выдает исключение безопасности), но злоумышленник просто игнорирует любое исключение и ждет, пока виртуальная машина выполнит финализацию частично инициализированного объекта. Когда это происходит, вызывается реализация злонамеренного метода finalize, предоставляя злоумышленнику доступ к нему, ссылка на доработанный объект. Хотя объект инициализирован лишь частично, злоумышленник все еще может вызывать для него методы (тем самым обходя проверку SecurityManager).

78
ответ дан 23 November 2019 в 04:01
поделиться

Совершенно верно.

Если конструктор не получает допустимые входные данные или не может правильно построить объект, у него нет другого выбора, кроме как вызвать исключение и предупредить вызывающего.

33
ответ дан 23 November 2019 в 04:01
поделиться

Да, конструкторам разрешено генерировать исключения.

Однако будьте очень мудры в выборе того, какие исключения они должны быть - отмеченными исключениями или не отмеченными. Непроверенные исключения в основном являются подклассами RuntimeException.

Почти во всех случаях (я не мог придумать исключение для этого случая) вам нужно будет генерировать проверенное исключение. Причина в том, что непроверенные исключения (например, NullPointerException) обычно возникают из-за ошибок программирования (например, недостаточной проверки входных данных).

Преимущество, которое предлагает проверенное исключение, заключается в том, что программист вынужден перехватить исключение в своем коде создания экземпляра, и тем самым понимает, что может быть сбой при создании экземпляра объекта. Конечно, только просмотр кода позволит выявить плохую практику программирования, связанную с проглатыванием исключения.

11
ответ дан 23 November 2019 в 04:01
поделиться

Да.

Конструкторы - это не что иное, как специальные методы, которые могут генерировать исключения, как и любой другой метод.

7
ответ дан 23 November 2019 в 04:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: