Могут ли конструкторы создавать исключения в Java?
Разрешено ли конструкторам создавать исключения?
Переведено автоматически
Ответ 1
Да, конструкторы могут создавать исключения. Обычно это означает, что новый объект немедленно подлежит сборке мусора (хотя, конечно, он может не собираться в течение некоторого времени). Однако "наполовину созданный" объект может остаться, если он сделал себя видимым ранее в конструкторе (например, назначив статическое поле или добавив себя в коллекцию).
Следует соблюдать осторожность при создании исключений в конструкторе: поскольку вызывающая сторона (обычно) не будет иметь возможности использовать новый объект, конструктор должен быть осторожен, чтобы избежать получения неуправляемых ресурсов (дескрипторов файлов и т.д.) И последующего создания исключения без их освобождения. Например, если конструктор пытается открыть a FileInputStream и a FileOutputStream, и первый завершается успешно, а второй завершается неудачей, вам следует попытаться закрыть первый поток. Это становится сложнее, если это конструктор подкласса, который генерирует исключение, конечно... все это становится немного сложнее. Это проблема не очень часто, но ее стоит рассмотреть.
Ответ 2
Да, они могут генерировать исключения. Если это так, они будут инициализированы только частично и, если не являются окончательными, подвергнутся атаке.
Доступ к частично инициализированным экземплярам класса, не являющегося окончательным, может быть получен с помощью атаки финализатора. Злоумышленник переопределяет защищенный метод finalize в подклассе и пытается создать новый экземпляр этого подкласса. Эта попытка завершается неудачей (в приведенном выше примере проверка SecurityManager в конструкторе ClassLoader выдает исключение безопасности), но злоумышленник просто игнорирует любое исключение и ожидает, пока виртуальная машина выполнит доработку частично инициализированного объекта. Когда это происходит, вызывается вредоносная реализация метода finalize, предоставляющая злоумышленнику доступ к этому, ссылку на завершаемый объект. Хотя объект инициализирован лишь частично, злоумышленник все равно может вызывать методы на нем (тем самым обходя проверку SecurityManager).
Ответ 3
Абсолютно.
Если конструктор не получает допустимых входных данных или не может сконструировать объект допустимым образом, у него нет другого выбора, кроме как выдать исключение и предупредить своего вызывающего.
Ответ 4
Да, он может генерировать исключение, и вы также можете объявить это в сигнатуре конструктора, как показано в примере ниже: