2010-04-21 7 views

ответ

31

Почти каждый метод должен был бы объявить его броском.

public void myMethod(String param) throws NullPointerException { 
    // 
} 

(Как заметка на полях. - Eclipse, например, дает предупреждение, если есть «потенциальный доступ нулевого указателя», так что вы можете предотвратить исключение как можно раньше)

+0

+1 - Это сделает код очень уродливым. – duduamar

+8

Также: ловить 'NullPointerException', в частности, почти всегда плохая идея. –

+0

Если бы у Java была возможность объявить, что функция не генерирует какое-либо исключение, можно сделать throw NullPointerException значением по умолчанию для каждой функции. Тогда можно было бы объявить функции, которые не бросают исключение NullPointerException, например 'public void myMethod (String param) не бросает NullPointerException' или не использует'! Throws' – asmaier

11

Нулевые исключения указателя являются расширения исключений Runtime и, следовательно, являются неожиданными событиями в потоке вашей программы. Было бы бессмысленно ожидать, что исключение null-указателя будет выбрано (надеюсь!), И поэтому вы никогда не объявите его как проверенное исключение.

15

Это не проверенное исключение (между прочим) , потому что очень распространено. Это может произойти почти везде. Если бы он был проверен, то почти каждый отдельный метод в каждой отдельной программе Java в любом месте должен был бы объявить, что он throws NullPointerException.

3

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

Но даже если у вас есть аргумент в пользу того, почему это должно быть проверенное исключение, в принципе каждая операция над ссылкой на объект может его бросить, поэтому он будет повсюду и буквально каждый метод в нетривиальной программе должен был бы бросить его - так какой смысл?

2

Мое собственное обязательное определение для проверки Исключение. Исключены исключения, из-за которых возникает API в случае известной нежелательной ситуации.

NullPointerException s не указывает на «известную нежелательную» ситуацию. Вместо этого, они, как правило, выбрасываются из-за некоторых неподчиненных ситуаций в коде. То есть, они в большинстве случаев из-за плохой практики кодирования. Например, попробуйте получить размер списка, который не инициализирован правильно и т. Д. Поэтому нет смысла делать их проверенными исключениями - поскольку каждый объект в Java может быть нулевым в какой-то момент?!. NullPoitnerException никогда не должен быть пойман.

+0

. В стеке вызовов должен быть захвачен высокий уровень, чтобы обеспечить лучший пользовательский интерфейс, в мое мнение – Yaneeve

+2

Это звучит как «известные неизвестные» Дика Чейни и «неизвестные неизвестные» ;-). –

+0

@yaneeve, я думаю, что «пойман» вы имели в виду проверку типа 'if (myList! = Null)' вида. Кроме этого, в коде не должно быть ничего похожего на 'catch (NullPointerException npe)'. Это должно * никогда не проходить проверку кода. –

3

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

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

+0

@Heinzi - Я бы не согласился с тем, что «происходит из-за чего-то в окружающей среде». Например, JAAS login moudle может вызывать 'LoginException', когда учетные данные неверны. Или 'AccountService' может бросить' InsufficientBalanceException' в каком-то бизнес-сценарии. Поэтому они не являются «средой», как таковой. –

+2

Ну, можно рассматривать пользовательский ввод и хранение данных как часть «среды», поскольку они являются внешними по отношению к логике самого кода. –

+0

@ring bearer, LoginException - это проблема с конфигурацией (средой) в большинстве случаев (пользователь не настроен или не настроен с этим паролем). Проверенные исключения могут использоваться так, как вы описали для AccountService, но поскольку это часть теоретического самодельного API, я не думаю, что это хороший пример. – Yishai

0

Зачем включать его, когда каждая функция, которую вы пишете, должна будет объявить ее? Просто чтобы сделать вашу жизнь простой.

1

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

0

IF Исключительное исключение указателя происходит, когда ваша прорам будет остановлена. Это исключение исключено.

Смежные вопросы