C++ 和 Java 中异常处理的区别?

2024-04-17

在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";
}

然后程序仍然崩溃并且异常没有被捕获。

那么C++中的异常处理有什么意义呢?我误解了什么吗?


崩溃的行正在取消引用无效的指针。在 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 处理程序,因此该行为很可能与终止线程的默认行为完全不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 和 Java 中异常处理的区别? 的相关文章

随机推荐

  • 当返回到已停止的活动时,旧数据会导致碎片膨胀

    活动 A 有片段 当它开始对活动 B 进行意图时 那么当B finish A执行onCreate again 但这一次 尽管A onCreate 有一个新的PacksPagerAdapter和一个新的ViewPager 片段用旧数据显示 我
  • 502 Kubernetes Ingress 网关错误

    我有一个 kubernetes 设置 其配置如下 kind Service apiVersion v1 metadata name myservice spec selector app my service ports protocol
  • 读取、表示和渲染地图数据的最佳方式是什么?

    我有兴趣编写一个简单的导航应用程序作为我的宠物项目 在搜索了免费地图数据后 我决定了美国人口普查局 TIGER http www census gov geo www tiger tgrshp2007 tgrshp2007 html2007
  • Android 6 (23) - 无需许可

    我坚持使用 Android 6 中的新权限模型 我在清单中定义了以下权限
  • 计算函数合理性的算法/蒙特卡罗方法

    我正在编写一个程序 尝试复制本文开头讨论的算法 http www stat stanford edu cgates PERSI papers MCMCRev pdf http www stat stanford edu cgates PER
  • 我将如何使用括号表示法中的单个变量来访问深度值?

    我想知道如何执行以下操作 我有以下数据 dta fielddata text1 4B030C2E 3D53 4DF8 A3535EF377B45DE5 text2 Unlabeled 我可以使用括号符号访问它 如下所示 var result
  • Google 表格中的正则表达式“NOT”(RE2)

    我想检查单元格中是否有一个单词而不是另一个单词 在这个帖子 https stackoverflow com questions 28775466 google sheet regexreplace match everything exce
  • 删除与某个模式匹配的多个文件

    我使用 Python 和 Django 制作了一个在线画廊 我刚刚开始添加编辑功能 从旋转开始 我使用 sorl thumbnail 按需自动生成缩略图 当我编辑原始文件时 我需要清理所有缩略图 以便生成新的缩略图 每张图片有三到四个 我针
  • Swift async/await 取代了 DispatchQueue.main.async

    在新的 Swift 5 5 中使用 async await 并发机制时如何返回主线程 我应该只用 MainActor 标记函数 类吗 我还能用吗DispatchQueue main async 会是正确的吗 因为新机制不使用 GCD 并且异
  • HABTM 与强参数的关联不会在 Rails 4 中保存用户

    用户模型 has and belongs to many events 事件模型 has and belongs to many users 用户控制器 params require user permit role event ids g
  • geoIP 从 ASP.NET 查找国家/地区

    我可以从 ASP NET 页面检索客户端的 IP 地址 至少是表面上的 IP 地址 我想知道是否有可以从代码隐藏访问的免费服务 当使用 IP 查询时 该服务将返回国家 地区 不需要城市 我无法使用基于 Web http 的服务 您必须手动输
  • 如何消除SQL中的NULL字段

    我正在为 SQL Server 2008 R2 开发 TSQL 查询 我正在尝试开发此查询来识别一条记录 客户 由于其中一些值为 NULL 因此我目前正在对大多数表执行 LEFT JOINS 但 LEFT JOIN 的问题是 现在我为某些客
  • Nestjs Apollo graphql上传标量

    我正在使用 Nestjs graphql 框架 我想使用 apollo 标量上传 我已经能够在另一个不包含 Nestjs 的项目中使用标量 schema graphql App module ts注册graphql GraphQLModul
  • 如何查询Firebase Firestore参考数据类型?

    我正在使用 Firestore参考 https firebase google com docs firestore manage data data types用于存储对用户的引用的数据类型 如下面的屏幕截图所示 用户参考 用户收藏 当我
  • Angular 4 + Electron - 如何运行应用程序并观察更改(实时重新加载)

    我正在使用 Angular 4 创建一个 Electron 应用程序 我如何设置它 以便它监视任何更改并实时重新加载它 包 json name angular electron version 0 0 0 license MIT main
  • 如何将网络音频流保存到文件(c++/java)

    是否有任何库或众所周知的方法来保存音频网络流 网络广播 mp3 流 以编程方式归档 您可以使用 libvlcVLC http www videolan org vlc 项目 这wiki http wiki videolan org Libv
  • 策略模式和访客模式有什么区别?

    我很难理解这两种设计模式 您能否给我上下文信息或示例 以便我可以得到清晰的想法并能够映射两者之间的差异 Thanks The 策略模式就像一个1 many关系 当存在一种类型的对象并且我想对其应用多个操作时 我使用策略模式 例如 如果我有一
  • mojoPortal 还是 Umbraco?

    我已经寻找免费 开源 ASP NET CMS 门户系统有一段时间了 并将其分为两个不同的系统 乌姆布拉科 http umbraco org http umbraco org 魔力门户 http www mojoportal com http
  • 如何让 ASP.NET DataPager 控件在 UpdatePanel 中工作?

    我有一个顶部有参数的搜索页面 底部有一个带有结果的搜索按钮 整个内容都包含在母版页内的更新面板中 单击搜索按钮后 它会显示第一页 但是 如果您单击 DataPager 上的下一个按钮 它不会显示第二页 它显示第二页没有结果 任何帮助将不胜感
  • C++ 和 Java 中异常处理的区别?

    在Java中 如果特定的代码行导致程序崩溃 那么异常就会被捕获并且程序会继续执行 但是 在 C 中 如果我有一段代码导致程序崩溃 例如 try int x 6 int p NULL p reinterpret cast