Как гласит название, мне интересно, что лучше всего относится к бросанию NullPointerExceptions. В частности, если у меня есть внешняя библиотечная функция, которая может возвращать null
в обстоятельствах, которые я не хочу обрабатывать (см. Ниже для конкретного примера), поскольку null
указывает на проблему с программным обеспечением. Вопрос в том, должен ли я
- проверить возвращаемое значение для
null
и выбросить NullPointerException самостоятельно, или - Должен ли я просто позволить Java выполнять грязную работу для меня, как только я попытаюсь использовать этот объект.
Первый подход позволяет мне добавить дополнительную информацию, так как я могу построить исключение NullPointerException, но второе делает для более чистого кода, на мой взгляд. Я также хотел бы задаться вопросом о любых последствиях для производительности, то есть является ли Java более эффективным при бросании NPE "изначально"?
В качестве примера я пытаюсь использовать Java Speech API для создания речевого синтезатора, используя следующий код:
synthesizer = Central.createSynthesizer(generalDesc);
if (synthesizer == null) {
// (1) throw NPE explicitly
throw new NullPointerException("No general domain synthesizer found.");
}
// (2) let the JVM throw the NPE when dereferencing
synthesizer.allocate();
Central.createSynthesizer
возвращает null
, если он не может найти подходящий синтезатор, который чаще всего вызван отсутствием файла speech.properties. Таким образом, это вопрос неправильной настройки системы и довольно неустранимый из во время выполнения, а не для ситуаций, которые необходимо обрабатывать программно. Таким образом, я считаю, что бросание NullPointerException является допустимым ответом, поскольку это указывает на ошибку (не в коде, а в развертывании программного обеспечения). Но поскольку объект synthesizer
разыменован в самом следующем утверждении, должен ли я позволить JVM бросить NPE для меня и сохранить нулевую проверку?
Добавление. Учитывая, что функция speech.properties загружается при запуске JVM в файловой системе (обычно) "user.home" или "java.home" /lib ", вызывает недоумение, что createSynthesizer
не выставляет NPE (это то, что я написал изначально во фрейдистском слайде), когда он не находит его, но вместо него возвращает null. Я думаю, что бросать NullPointerException - это то, что нужно сделать здесь, потому что это указывает на реальную ошибку при развертывании программного обеспечения.