Вопрос был задан в интервью. NullPointerException
очень распространен; почему он не объявлен как проверенное исключение? Я googled, но не получил правильного ответа.Почему NullPointerException не объявлено как исключенное исключение
ответ
Почти каждый метод должен был бы объявить его броском.
public void myMethod(String param) throws NullPointerException {
//
}
(Как заметка на полях. - Eclipse, например, дает предупреждение, если есть «потенциальный доступ нулевого указателя», так что вы можете предотвратить исключение как можно раньше)
Нулевые исключения указателя являются расширения исключений Runtime и, следовательно, являются неожиданными событиями в потоке вашей программы. Было бы бессмысленно ожидать, что исключение null-указателя будет выбрано (надеюсь!), И поэтому вы никогда не объявите его как проверенное исключение.
Это не проверенное исключение (между прочим) , потому что очень распространено. Это может произойти почти везде. Если бы он был проверен, то почти каждый отдельный метод в каждой отдельной программе Java в любом месте должен был бы объявить, что он throws NullPointerException
.
Ответ на один предложение, который я бы дал, это то, что он является результатом ошибки программирования, а исключения ошибок программирования не являются проверенными исключениями (IllegalStateException, ClassCastException и т. Д.).
Но даже если у вас есть аргумент в пользу того, почему это должно быть проверенное исключение, в принципе каждая операция над ссылкой на объект может его бросить, поэтому он будет повсюду и буквально каждый метод в нетривиальной программе должен был бы бросить его - так какой смысл?
Мое собственное обязательное определение для проверки Исключение. Исключены исключения, из-за которых возникает API в случае известной нежелательной ситуации.
NullPointerException
s не указывает на «известную нежелательную» ситуацию. Вместо этого, они, как правило, выбрасываются из-за некоторых неподчиненных ситуаций в коде. То есть, они в большинстве случаев из-за плохой практики кодирования. Например, попробуйте получить размер списка, который не инициализирован правильно и т. Д. Поэтому нет смысла делать их проверенными исключениями - поскольку каждый объект в Java может быть нулевым в какой-то момент?!. NullPoitnerException никогда не должен быть пойман.
. В стеке вызовов должен быть захвачен высокий уровень, чтобы обеспечить лучший пользовательский интерфейс, в мое мнение – Yaneeve
Это звучит как «известные неизвестные» Дика Чейни и «неизвестные неизвестные» ;-). –
@yaneeve, я думаю, что «пойман» вы имели в виду проверку типа 'if (myList! = Null)' вида. Кроме этого, в коде не должно быть ничего похожего на 'catch (NullPointerException npe)'. Это должно * никогда не проходить проверку кода. –
Проверяемые исключения может произойти потому, что что-то в среде, над которым ваша программа имеет практически никакого контроля, не заладилось (например IOException
, SQLException
). Вы можете ожидать этого и обрабатывать этот случай.
A NullPointerException
(обычно) происходит из-за ошибки в вашем коде. Если вы ожидаете, что NullPointerException будет выбрано, правильным решением будет исправить ошибку, а не обрабатывать исключение.
@Heinzi - Я бы не согласился с тем, что «происходит из-за чего-то в окружающей среде». Например, JAAS login moudle может вызывать 'LoginException', когда учетные данные неверны. Или 'AccountService' может бросить' InsufficientBalanceException' в каком-то бизнес-сценарии. Поэтому они не являются «средой», как таковой. –
Ну, можно рассматривать пользовательский ввод и хранение данных как часть «среды», поскольку они являются внешними по отношению к логике самого кода. –
@ring bearer, LoginException - это проблема с конфигурацией (средой) в большинстве случаев (пользователь не настроен или не настроен с этим паролем). Проверенные исключения могут использоваться так, как вы описали для AccountService, но поскольку это часть теоретического самодельного API, я не думаю, что это хороший пример. – Yishai
Зачем включать его, когда каждая функция, которую вы пишете, должна будет объявить ее? Просто чтобы сделать вашу жизнь простой.
Проверенные исключения предназначены только для тех случаев, когда программа может ее восстановить. Вызов чего-то на объект NULL является проблемой программистов и не может быть восстановлен.
IF Исключительное исключение указателя происходит, когда ваша прорам будет остановлена. Это исключение исключено.
- 1. Как обрабатывать исключенное исключение?
- 2. Почему исключение должно быть объявлено?
- 3. Исключенное исключение запроса
- 4. Исключенное Java исключение
- 5. FAIL - Исключенное исключение org.apache.catalina.LifecycleException
- 6. Исключенное для объекта исключение
- 7. isEqualToString: выдает исключенное исключение
- 8. Почему существует исключение NullPointerException?
- 9. Почему существует исключение NullPointerException?
- 10. Исключенное исключение в переопределенном методе, не восстанавливающем
- 11. Java: полученное исключение VS Исключенное исключение
- 12. Ручка бросает a Исключенное исключение
- 13. Исключенное исключение запроса в elasticsearch
- 14. Исключенное исключение окна в android
- 15. Почему этот код не выдает исключение NullPointerException?
- 16. Почему этот код НЕ возвращает исключение NullPointerException?
- 17. Почему я не получаю исключение NullPointerException
- 18. Почему NumberFormat.format выбрасывает исключение NullPointerException?
- 19. Почему это бросает исключение NullPointerException?
- 20. Почему не исключение NullPointerException в консоли?
- 21. Как отправить исключенное исключение из NewRelic?
- 22. Исключение объявлено, но не обработано SCJP
- 23. pexpect-как обрабатывать исключение, исключенное из списка
- 24. Почему я не получаю исключение NullPointerException?
- 25. Почему это не вызывает исключение NullPointerException?
- 26. Как компилятор идентифицирует, что существует исключенное исключение
- 27. Почему это вызывает исключение NullPointerException?
- 28. Почему это вызывает исключение NullPointerException?
- 29. Почему я получаю исключение NullPointerException?
- 30. Почему TableView создает исключение NullPointerException?
+1 - Это сделает код очень уродливым. – duduamar
Также: ловить 'NullPointerException', в частности, почти всегда плохая идея. –
Если бы у Java была возможность объявить, что функция не генерирует какое-либо исключение, можно сделать throw NullPointerException значением по умолчанию для каждой функции. Тогда можно было бы объявить функции, которые не бросают исключение NullPointerException, например 'public void myMethod (String param) не бросает NullPointerException' или не использует'! Throws' – asmaier