NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Если Ваша поддержка внедрения библиотеки стандарта C++ функции TR1 fetestexcept
, feraiseexcept
и feclearexcept
(мой еще не делает, таким образом, я не могу протестировать это), можно обнаружить пять видов ошибок с плавающей точкой, и затем можно выдать любые исключения, которые Вы хотите.
Посмотрите здесь для описания этих функций.
Я также рекомендую раздел 12.3, "Управляя Средой С плавающей точкой", из книги Расширения Библиотеки Стандарта C++: Учебное руководство и Ссылка Pete Becker, ISBN-13: 9780321412997, для превосходного описания этих функций с примером кода.
Из-за пути сигналы и работа исключений, Вы не можете сделать этого сразу, когда сигнал брошен - исключения полагаются на определенные аспекты стека, которые не верны, когда обработчик сигналов называют.
Можно установить глобальную переменную в обработчике сигналов, и затем проверить это в ключевых пунктах в программе и выдать исключение, если это установлено. Это не дает Вам точную информацию о вызванной исключительной ситуации, все же.
У меня нет готового решения, но одной вещью, на которую Вы могли посмотреть, являются сигналы (не уверенный, можно ли безопасно бросить исключения C++ от них, но она должна помочь для отладки так или иначе.)
Вы могли установить обработчик сигналов для SIGFPE и использование это для Вашей отладки целей.
gcc опция-fnon-call-exceptions могла бы быть несколько полезной Вам. Не удалось найти документацию относительно него, хотя, таким образом, Ваш пробег может варьироваться.
Основная идея будет состоять в том, чтобы Вы установили соответствующие обработчики сигналов для исключений в операции с плавающей запятой. В Вашем обработчике сигналов можно выдать исключение (или отправить пользовательский сигнал в другой процесс, который повысит исключение или отправит сообщение в другой поток для чего-то подобного, и т.д. и т.д. и т.д.). Существует любое количество способов на самом деле выдать исключение - главное состоит в том, чтобы обработать сигнал.