Примите это с недоверием, потому что я не касался компилятора C ++ с 1999 года. С STL и C ++ многое изменилось, что, возможно, все изменилось. Тем не менее, это то, что я помню.
Модель исключений в C ++ сильно отличается от модели в Java. Вы должны быть очень, очень, но намного более активными в проверке ошибок (и в создании собственных исключений).
В Java вызов для отмены ссылки на ссылку, в конечном счете, является инструкцией байт-кода, отправляемой и интерпретируемой JVM. JVM всегда проверяет (внутренне), является ли ссылка нулевой, и когда она обнаруживает, что это так, она автоматически генерирует исключение java.lang.NullPointerException.
Если бы JVM не была запрограммирована на такую вещь, доступ к нулевой ссылке вызвал бы сбой JVM с SEGFAULT - именно то поведение, которое можно было бы ожидать с компилированным неохраняемым языком при обнаружении неохраняемого нулевого указателя. разыменование (не только C или C ++, но также в Pascal, Ada, Assembly или даже в старом добром BASIC, пытающемся сделать PEEK / POKE в неверном месте адреса.)
Способ (по крайней мере, в мое время) в C ++ (или на любом из упомянутых мною языков) состоял в том, чтобы явно проверить, был ли указатель (или адрес, назначаемый для ссылки) нулевым. В этот момент, если тест возвращает true, вы запускаете свое исключение. Вы не идете слепо за указателем. Вы должны явно проверить его на нулевое значение (или иметь очень строго гарантированное предварительное условие , которое указатель фактически указывает на то, к чему вам нужно получить доступ) перед разыменованием.
Это несколько эквивалентно следующему псевдокоду Java
if( myPossiblyBadReference == null )
{
throw java.lang.NullPointerException( "you suck!" );
// or throw my.own.NPEException(); // preferably a specialization of NullPointerException
}
else
{
doYourThingieWith( myPossiblyBadReference );
}
Теперь все может быть сделано по-другому в C ++, особенно сейчас, когда материал C ++ 0x идет по каналу (о котором я понятия не имею.) Но, по крайней мере, с этим поведением мне пришлось столкнуться при кодировании в C ++.
Другими словами, для выполнения подобных задач требуется гораздо больше смазки для локтя. Помните, что вы работаете на более низком уровне абстракции, чем тот, который предоставляется JVM.
JVM - это барьер, который дает вам много хороших возможностей по обработке ошибок (на которые мы, Java-разработчики, склонны слишком полагаться). Эти возможности по обработке ошибок должны быть явно закодированы, когда вы работаете на более низком уровне. уровень (не только в C ++.)