崩溃的行正在取消引用无效的指针。在 C++ 中,这不会引发异常。相反,它是未定义的行为。
没有这样的东西C++中的空指针异常 https://stackoverflow.com/questions/1823721/how-to-catch-the-null-pointer-exception,不像Java会抛出空指针异常。相反,取消引用无效指针将导致未定义的行为。未定义的行为并不总是意味着崩溃,但是如果它崩溃了,那么你很幸运。
语言概述:
最后和RAII
C++ 和 Java 之间最显着的区别之一是 Java 支持finally
陈述。代码在finally
无论前面的代码是否存在,块总是运行catch
块是否被执行。例如:
try
{
}
catch (SomeException e)
{
}
finally
{
//code here is always exectued.
}
finally 语句的目的是允许程序员在此时进行清理,即释放套接字、关闭文件句柄等...尽管 Java 运行垃圾收集器,但垃圾收集仅适用于内存而不适用于其他资源。仍然有一些场合你必须这样做手动处置资源 http://download.oracle.com/javase/tutorial/essential/exceptions/finally.html。现在C++没有finally
声明,因此建议该语言的用户遵守 RAII 原则(资源获取即初始化)Stroustrup 对此有一个解释:http://www.stroustrup.com/bs_faq2.html#finally 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 处理程序,因此该行为很可能与终止线程的默认行为完全不同。