Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Второе. Вот моя попытка заключения в кавычки Sutter
"Бросок значением, выгода ссылкой"
Учатся
catch
правильно: Выдайте исключения значением (не указатель) и поймайте их ссылкой (обычно кconst
). Это - комбинация, которая сцепляется лучше всего с семантикой исключения. При переброске того же исключения предпочтите всегоthrow;
throw e;
.
Вот полное Объект 73. Бросок значением, поймайте ссылкой.
<час>причина постараться не ловить исключения значением состоит в том, что оно неявно делает копию исключения. Если исключение будет иметь подкласс, то информация об этом будет потеряна.
try { throw MyException ("error") }
catch (Exception e) {
/* Implies: Exception e (MyException ("error")) */
/* e is an instance of Exception, but not MyException */
}
Ловля ссылкой избегает этой проблемы, не копируя исключение.
try { throw MyException ("error") }
catch (Exception& e) {
/* Implies: Exception &e = MyException ("error"); */
/* e is an instance of MyException */
}
Кроме того, обратите внимание, что при использовании MFC Вы можете иметь к выгода указателем . Иначе ответ @JaredPar является способом, которым необходимо обычно идти (и надо надеяться никогда не иметь для контакта с вещами, которые бросают указатель).
Лично, я пошел бы для третьей опции:
catch (const _com_error& e)
Определенно второе. Если у Вас было следующее:
class my_exception : public exception
{
int my_exception_data;
};
void foo()
{
throw my_exception;
}
void bar()
{
try
{
foo();
}
catch (exception e)
{
// e is "sliced off" - you lose the "my_exception-ness" of the exception object
}
}