Эффективная Java рекомендует, чтобы мы не catch
NullPointerException
.
Всегда ли это правильно?
Во многих случаях ловли NullPointerException
тело catch вызывает только printStackTrace()
.
Если я не поймаю NullPointerException
и звоню printStackTrace()
, как я могу проверить место, где произошел exception
?
А также, если я поймаю NullPointerException
и тело catch
пуст, мы не можем получить информацию о стеке в это время, можем ли мы?
UPDATE
Я проанализировал статистику захвата RuntimeException в источнике google android, AOSP4.2.2_r1.2.
Есть 249 RuntimeExceptoin, а следы - статистика catch-body.
42%: throw it again as other Exceptions (RuntimeException: 33%, others: 8%)
32%: just return null or 0/false/true or other default values
14%: just call log or printstacktrace
5%: just comment like "// Fall through.", "// ignore, not a valid type.", "// system process dead", "// do nothing"
2%: empty body
3%: display error messages or send fail codes (ex. network service discovery failed: replyToMessage(msg, NsdManager.STOP_DISCOVERY_FAILED, NsdManager.FAILURE_INTERNAL_ERROR); )
3%: intialize or reset related variables.
В почти случаях dalvik и внешняя ручка NPE, бросая другие Исключения.
Но фреймворки обычно обрабатывают, возвращая нулевые или другие значения.
-
Считаете ли вы, что выброс других Исключений в catch-body не является плохим или хорошим управлением?
-
Если NPE встречается на более высоких уровнях (например, приложения), и разработчик подтверждает, что исключение не является критическим, потому что приложение полностью независимо, могу ли я принять для нашего разработчика игнорировать NPE, поймав?
и еще одна вещь,
Могу ли я заключить, что исходный код платформы Google для Android может быть нестабильным в аспектах RuntimeException
?