gpt4 book ai didi

java - C++和Java中的异常处理之间的区别?

转载 作者:IT老高 更新时间:2023-10-28 20:33:02 27 4
gpt4 key购买 nike

在Java中,如果特定的代码行导致程序崩溃,则捕获异常并继续执行程序。

但是,在 C++ 中,如果我有一段代码导致程序崩溃,例如:

try
{
int x = 6;
int *p = NULL;
p = reinterpret_cast<int*>(x);

*p = 10; // the program crashed here

cout << "x = " << *p << endl;
}
catch(const char* Message)
{
cout << "There is an run-time error";
}

然后程序还是crash,没有捕获到异常。

那么,C++ 中异常处理的意义何在?我是不是误会了什么?

最佳答案

崩溃的行是取消引用一个无效的指针。在 C++ 中,这不会引发异常。相反,它是未定义的行为。

没有 null pointer exception in C++ 这样的东西,不像Java会抛出一个空指针异常。相反,取消引用无效指针将导致未定义的行为。未定义的行为并不总是意味着崩溃,但是如果它崩溃了,你就很幸运了。

语言概览:

最后是 RAII

C++ 和 Java 之间最显着的区别之一是 Java 支持 finally 语句。 finally block 中的代码始终运行,无论前面的 catch block 中的代码是否被执行。例如:

try
{
}
catch (SomeException e)
{
}
finally
{
//code here is always exectued.
}

finally 语句的目的是允许程序员在该点进行清理,即释放套接字、关闭文件句柄等......即使 Java 运行垃圾收集器,垃圾收集也只适用于内存而不适用于其他资源。还是有需要manually dispose of resources的情况.现在 C++ 没有 finally 语句,因此建议该语言的用户遵守 RAII 原则(资源获取即初始化)Stroustrup 在这里对此进行了解释:http://www.stroustrup.com/bs_faq2.html#finally .我更喜欢称它为 Resource destroy is deallocation 但基本上当您的对象超出范围时,调用析构函数,然后该析构函数应该释放对象维护的任何资源。

例如,C++11x 提供了一个 std::unique_ptr 来管理这个:

void foo()
{
std::unique_ptr<T> t(new T)
try
{
//code that uses t
}
catch (...)
{
}
}

new分配的资源会在函数结束时被删除。

捕获所有语句

因为Java中的所有异常都继承自一个公共(public)基类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 处理程序,因此该行为很可能与终止线程的默认行为完全不同。

关于java - C++和Java中的异常处理之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7480146/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com