Сбой строки - разыменование неверного указателя.В C ++ это не будет исключением.Вместо этого это неопределенное поведение.
В C ++ нет такой вещи, как исключение нулевого указателя, в отличие от Java, которое вызывает исключение нулевого указателя.Вместо этого разыменование недействительного указателя приведет к неопределенному поведению.Неопределенное поведение не всегда подразумевает сбой, однако, если он дает сбой, вам повезло.
Обзор языка:
И наконец, RAII
Одно из самых существенных различий между C ++и Java в том, что Java поддерживает оператор finally
.Код в блоке finally
всегда выполняется независимо от того, выполняется код в предыдущем блоке catch
или нет.Например:
try
{
}
catch (SomeException e)
{
}
finally
{
//code here is always exectued.
}
Цель оператора finally состоит в том, чтобы разрешить программисту очистку на этом этапе, то есть освобождение сокетов, закрытие файловых дескрипторов и т. Д. Несмотря на то, что Java запускает сборщик мусора, только сборщик мусораотносится к памяти и никаких других ресурсов.Бывают случаи, когда вам нужно вручную утилизировать ресурсы .Теперь в C ++ нет оператора finally
, поэтому пользователям языка рекомендуется придерживаться принципа RAII (Resouce Acquisition is Initialization). Страуструп имеет объяснение по этому поводу здесь: http://www.stroustrup.com/bs_faq2.html#finally. Я предпочитаю называть его Resource destruction is deallocation
но в основном, когда ваш объект выпадает из области видимости, вызывая деструктор, тогда этот деструктор должен высвобождать любые ресурсы, поддерживаемые объектом.
Например, C ++ 11x предоставляет std :: unique_ptr для управления этим:
void foo()
{
std::unique_ptr<T> t(new T)
try
{
//code that uses t
}
catch (...)
{
}
}
Ресурс, выделенный с помощью new
, будет удален после завершения функции.
перехват всех операторов
Поскольку все исключения в Java наследуются от общего базового классаException
если вы хотите, чтобы ваше предложение catch перехватывало любое исключение, установите его следующим образом:
catch (Exception e)
{
//any exception thrown will land here.
}
В C ++ нет ограничений на то, что может быть выдано, и нет общего базового класса для всех исключений.Стандартная практика состоит в том, чтобы сформировать свой пользовательский класс исключений путем наследования от std :: exception, но язык не обеспечивает этого.Вместо этого есть специальный синтаксис для перехвата всех исключений:
catch (...)
{
}
Необработанные исключения
Это еще одна область, в которой языки ведут себя по-разному.В C ++ выброшенное исключение, которое не перехватывается, вызывает std :: terminate.Поведение по умолчанию в std :: terminate - это вызов abort, который генерирует SIGABRT, и вся программа останавливается.
В Java поведение состоит в том, чтобы распечатать трассировку стека и завершить поток, в котором возникло необработанное исключение. Однако, посколькуJava-программист может предоставить обработчик UncaughtException, поведение которого вполне может отличаться от используемого по умолчанию завершения потока.