Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Как лучше поступить, если нужно бросить Exception с комментарием?

#java #android #инспекция_кода #исключения


Возникла ситуация при которой я достаю данные из Intent, необходимо обрабатывать
на NullPointerException, но если вдруг кинет это Exception, то всё равно нужно крашить
прогу, т.к. данное поведение недопустимо, но добавить комментарий, почему именно так
вышло, я в свою очередь делаю так

try{
    mCPath = new CPath(intent.getStringExtra(EXTRA_CPATH)); 
}catch(NullPointerException e){
    throw new NullPointerException("EXTRA_CPATH must be not null");
}


Но мой тимлид говорит, что так не хорошо, необходимо кинуть другой exception, а именно
RuntimeException

try{
    mCPath = new CPath(intent.getStringExtra(EXTRA_CPATH)); 
}catch(NullPointerException e){
    throw new RuntimeException("EXTRA_CPATH must be not null");
}


Не совсем понимаю логики, в данном контексте программы, по моему личному мнению,
если приходить Null, то и кидать нужно null, просто дополнить комментарием или я не прав?
    


Ответы

Ответ 1



(Экстраполирую информацию из .NET, могу ошибаться.) NullPointerException — это системное исключение, которое генерируется в недрах виртуальной машины Java, которое возникает при обращении по околонулевому адресу, что вообще отслеживается на уровне операционной системы. Дурной тон — и ловить исключение, и бросать его. Ловить исключение не надо, потому что обращение к нулевому объекту — это ошибка в логике приложения. Если какая-то переменная или какое-то поле у вас null, то нужно проверять это значение, а не рассчитывать на то, что рантайм бросит NPE. Кидать исключение не надо, потому что программисты могут ожидать, что исключение возникнет на системном уровне, а не будет вручную сгенерировано пользовательским кодом. Как правильно поступить в вашем случае? Проверить intent на null, и если значение отсутствует, то бросить исключение, наиболее подходящее логически, да хотя бы IllegalStateException. Если значение null пришло в виде аргумента, то следует бросать IllegalArgumentException. И уж точно не должно быть никаких try-catch. Похоже, в Java есть разные взгляды на использование исключения, но в целом преобладает моя точка зрения. См. тж.: Is it okay to throw NullPointerException programatically? IllegalArgumentException or NullPointerException for a null parameter?

Ответ 2



Все логично и прекрасно, но в стандартной библиотеке Java принято кидать NullPointerException: java.util.Objects.requireNonNull кидает NPE. java.util.Map.put разрешает кидать NPE, если реализация интерфейса не поддерживает null как ключ или значение. Joshua Bloch в Effective Java (2nd ed) Item 60 пишет: Если при вызове null передается вместо параметра, для которого null - запрещенное значение, соглашение предписывает бросать NullPointerException, а не IllegalArgumentException. Документация на NullPointerException сообщает: Приложению следует бросать экземпляры этого класса, чтобы указать на недопустимое использование null. Короче, NPE бросать нормально, NPE бросать похвально. Тем не менее, демократическим путем установлено, что NullPointerException - это плохо. Конкретно по коду в вопросе, если вы уверены, что EXTRA_CPATH не будет null никогда-никогда, а оно вдруг null, и остается только убить приложение, кидайте сразу AssertionError. Поскольку вы явно ловите unchecked exception, вы в этом не уверены, и следует проверять и закрывать приложение нормальным способом, с уведомлением пользователя.

Ответ 3



Немного почитав на эту тему пришол к выводу, что ловить NPE не самое лучшее решение, т.к. это может скрыть в будущем баги, а именно представьте ситуацию: допустим вы предполагаете, что какая-то переменная по известным вам причинам может быть null и вы отлавливаете это и что-то с этим всем делаете, но вполне реальна такая ситуация, что null мог прийти по абсолютно другим причинам и тогда вы можете неправильно обработать эту ситуацию, в общем это краткое пояснение почему не стоит так делать, тему можно закрывать.

Комментариев нет:

Отправить комментарий