Было бы полезно включить имя класса и имя переменной в любое сообщение NullPointerException? - PullRequest
1 голос
/ 19 сентября 2008

Было бы полезно включить имя класса и имя переменной в любое сообщение NullPointerException? Я знаю, что это не всегда возможно из-за изменений, внесенных JIT, но кажется, что информация должна быть доступна часто (члены класса и т. Д.)

От: http://jamesjava.blogspot.com/2005/04/what-was-null.html

Ответы [ 5 ]

2 голосов
/ 19 сентября 2008

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

1 голос
/ 19 сентября 2008

Предоставлять как можно больше информации во время ошибок - это хорошо ... Хорошо?

Помогает отслеживать ошибки.

Редактировать: (Да)

0 голосов
/ 19 сентября 2008

Нет, я не думаю, что это вообще было бы "полезно".

Вместо этого вам следует остерегаться не бросать NPE. Проверка ваших значений перед их использованием (null проверка) и лайков. Это должно произойти за до вызова метода библиотеки и после возврата результата (если API указывает, что метод может вернуть null. Конечно, иногда это так и происходит) в любом случае, но тогда это ошибка).

Если вы считаете, что NPE должны нести эту информацию для отладки, подумайте еще раз. Вот для чего хороши отладчики. Исключение - просто сообщить вам, что что-то пошло не так. Помните, что непроверенные исключения возникают во время выполнения - и должны быть сгенерированы там. Чтобы исключение узнало, какая переменная содержит null, байт код должен знать об именах переменных. Вы не хотите переполнять свой байт-код такими вещами. Имя класса содержится в каждом выводе журнала, который я получаю из своих программ. Вот для чего нужна регистрация.

Java уже значительно облегчает процесс отладки, предоставляя вам номер строки и полную трассировку стека. Программы на С не работают с Segmentation fault. Вы должны использовать strace или отладчик, чтобы получить столько информации.

Обратите внимание, что javac включает опцию времени компиляции для включения информации исходного файла во время компиляции, но она предназначена для использования отладчиком, не случайные исключения которые бросают. Цитата справочной страницы Sun javac:

             -g Generate all debugging information, including local variables.
                By default, only line number and  source  file information is 
                generated.

             -g:none
                Do not generate any debugging information.

             -g:{keyword list}
                Generate  only  some  kinds  of debugging information, specified 
                by a comma separated list of keywords. Valid keywords are:

                source<br/>
                   Source file debugging information

                lines
                   Line number debugging information

                vars
                   Local variable debugging information

Короче говоря: используйте отладчик.

0 голосов
/ 19 сентября 2008

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

0 голосов
/ 19 сентября 2008

Вы бросаете NullPointerException? Я думаю, что вы, вероятно, должны сделать null проверки в коде. Я также хотел бы рассмотреть возможность использования инструментов ведения журнала с открытым исходным кодом, таких как Log4J.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...