Являются ли конструкторы разрешенными исключениями?Могут ли конструкторы исключать исключения из Java?
ответ
Да, конструкторы могут исключать исключения. Обычно это означает, что новый объект сразу же подходит для сбора мусора (хотя его, возможно, не собирают в течение некоторого времени, конечно). Возможно, что «полуконструированный» объект будет придерживаться, хотя, если он стал видимым ранее в конструкторе (например, назначив статическое поле или добавив себя в коллекцию).
Остерегайтесь бросать исключения в конструкторе: поскольку вызывающий объект (обычно) не будет использовать новый объект, конструктор должен быть осторожным, чтобы избежать получения неуправляемых ресурсов (файлы и т. Д.) И затем бросая исключение, не отпуская их. Например, если конструктор пытается открыть FileInputStream
и FileOutputStream
, а первый успешно завершается, а второй терпит неудачу, вы должны попытаться закрыть первый поток. Это становится сложнее, если это конструктор подкласса, который генерирует исключение, конечно ... все становится немного сложнее. Это не проблема очень часто, но это стоит рассмотреть.
Абсолютно.
Если конструктор не получает правильного ввода или не может построить объект в допустимом порядке, у него нет другого варианта, кроме как выдать исключение и оповестить его вызывающего.
Да.
Конструкторы представляют собой не что иное, как специальные методы, и могут генерировать исключения, как любой другой метод.
Важная вещь в вашем заявлении - «специальные методы». Поэтому они не похожи ни на какой другой метод. Выброс исключения из конструктора без конечного класса ** мог бы создать дыру в безопасности, поэтому при принятии решения об этом нужно проявлять особую осторожность. См. Ответ от @Billy выше, с выпиской из Java Secure Coding Guidelines. –
Да, конструкторам разрешено исключать исключения.
Однако будьте очень мудры в выборе каких исключений они должны быть - проверены исключения или непроверены. Исключенные исключения - это в основном подклассы RuntimeException.
Практически во всех случаях (я не мог придумать исключение из этого случая), вам нужно выбросить проверенное исключение. Причина в том, что исключенные исключения (например, NullPointerException) обычно возникают из-за ошибок программирования (например, недостаточно для проверки входных данных).
Преимущество, которое предлагает проверенное исключение, заключается в том, что программист вынужден поймать исключение в своем коде инстанцирования и тем самым понимает, что может возникнуть сбой при создании экземпляра объекта. Конечно, только обзор кода поймает плохую практику программирования проглатывания исключения.
Да, они могут делать исключения. Если это так, они будут только частично инициализированы и, если они не являются окончательными, подлежат атаке.
следующее: Secure Coding Guidelines 2.0.
Частично инициализированные экземпляры не конечного класса могут быть доступны посредством атаки финализатора. Атакующий переопределяет защищенный метод finalize в подклассе и пытается создать новый экземпляр этого подкласса. Эта попытка не выполняется (в приведенном выше примере проверка SecurityManager в конструкторе ClassLoader вызывает исключение безопасности), но злоумышленник просто игнорирует любое исключение и ожидает, что виртуальная машина выполнит финализацию на частично инициализированном объекте. Когда это происходит, вызывается реализация метода злонамеренного финализа, предоставляющая злоумышленнику доступ к этому, ссылка на завершаемый объект. Хотя объект только частично инициализирован, злоумышленник все равно может вызывать методы на нем (тем самым обходя проверку SecurityManager).
Означает ли это, что бросание из не-конечного класса является нарушением безопасности? Это еще проблема? – kroiz
Обратите внимание, что это руководство имеет значение только в том случае, если ваш код является или может использоваться в контексте важности безопасности. Например, большинство Java-кода используются в контекстах, где нет SecurityManager. –
Конструктор МОЖЕТ выбрасывать любое исключение. Но если какой-либо конструктор подкласса вызывает конструктор суперкласса, который генерирует исключение, то конструктор подкласса должен либо поймать исключение, либо выбросить его.
Конструктор подкласса не может поймать исключение, так как использование блока try до того, как super() вызовет ошибку компиляции («вызов super должен быть первым выражением в конструкторе») –
Да, он может бросить исключение, и вы можете заявить, что в подписи конструктора тоже, как показано в следующем примере:
public class ConstructorTest
{
public ConstructorTest() throws InterruptedException
{
System.out.println("Preparing object....");
Thread.sleep(1000);
System.out.println("Object ready");
}
public static void main(String ... args)
{
try
{
ConstructorTest test = new ConstructorTest();
}
catch (InterruptedException e)
{
System.out.println("Got interrupted...");
}
}
}
да это может бросить исключение, как другой метод делает
Большое спасибо за этот подробный ответ, хотя этот вопрос на который были получены ответы гораздо лучше. – Tom
- 1. Следует ли исключать исключения?
- 2. Когда мы должны исключать исключения или исключать исключения в методе?
- 3. Когда следует исключать исключения?
- 4. Где следует исключать исключения?
- 5. Могут ли компиляторы исключать бесконечные петли?
- 6. могут ли конструкторы действительно возвращать строки?
- 7. Могут ли созданные фабрикой объекты иметь конструкторы?
- 8. Конструкторы и исключения Ruby
- 9. Могут ли конструкторы выполнять операции как метод?
- 10. Собственные конструкторы класса исключения
- 11. Конструкторы Исключения в dispposable объекта
- 12. Нужно ли нам исключать исключения для методов P/Invoke?
- 13. Java - переопределение метода Object toString(), но я должен исключать исключения
- 14. Почему вы должны исключать исключение в java
- 15. Допустимо ли исключать исключения, если не получить ожидаемые данные JSON?
- 16. Как следует исключать исключения из API RESTful для получения результатов?
- 17. Должен ли Java POJO проверять поле и исключать исключения в методах setter?
- 18. Должны ли серверные методы исключать исключения, если доступ запрещен?
- 19. Лучше ли исключать исключения или избегать исключений любой ценой?
- 20. Должны ли веб-сервисы исключать исключения или объекты результата
- 21. Почему конструкторы не могут быть окончательными
- 22. Могут ли реализации исключений Runtime.publish() бросать исключения?
- 23. Должен ли я исключать исключение из HttpStatus в модели?
- 24. конструкторы (java)
- 25. Можно ли всегда исключать goto?
- 26. Android: можно ли исключать исключения из базы данных SQLite во время транзакций?
- 27. Могут ли исключения памяти вызвать NullPointerException?
- 28. Java - конструкторы
- 29. Будет ли исключение Java исключать все приложение Java?
- 30. Наследующие конструкторы java
+1. Никто обычно не думает об исключениях, брошенных подклассами. –
@JonSkeet: ** Не могли бы вы дать нам пример кода о ** *, если он стал видимым ранее в конструкторе (например, назначив статическое поле или добавив себя в коллекцию). *? – Tarik
@Tarik: Ну, пример кода будет делать именно это - например. 'someStaticField = this;' или 'someCollection.add (this)' внутри конструктора. –