当前位置: 首页 > 面试题库 >

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

邢冷勋
2023-03-14
问题内容

在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 ++中不存在空指针异常,这与Java会抛出空指针异常不同。相反,取消引用无效的指针将导致未定义的行为。未定义的行为并不总是意味着崩溃,但是如果崩溃,您很幸运。

语言概述:

最后和RAII

C
++和Java之间最重要的区别之一是Java支持finally语句。在代码finally块始终不管前述代码中是否运行catch块执行与否。例如:

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

finally语句的目的是允许程序员在那时进行清理,即释放套接字,关闭文件句柄等。即使Java运行垃圾回收器,垃圾回收也仅适用于内存,而没有其他资源。在某些情况下,您仍然必须手动处理资源。现在C
++没有finally声明,因此建议该语言的用户遵守RAII原则(资源获取是初始化)。Stroustrup在此提供了对此的解释: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函数结束后,分配给via的资源将被删除。

捕捉所有陈述

因为Exception如果您希望catch子句捕获任何异常,那么Java中的所有异常都将从一个公共基类继承,因此请按以下步骤进行设置:

catch (Exception e)
{
  //any exception thrown will land here.
}

在C ++中,对引发的异常没有任何限制,并且对于所有异常都没有通用的基类。标准做法是通过继承std ::
exception来形成您的自定义异常类,但是语言不会强制执行此操作。而是有一种特殊的语法来捕获所有异常:

catch (...)
{

}

未处理的异常

这是语言表现不同的另一个领域。在C ++中,未捕获的引发异常将调用std :: terminate。std ::
terminate的默认行为是调用abort,它会生成SIGABRT,并且整个程序都会停止。

在Java中,行为是打印堆栈跟踪并终止发生未捕获的异常的线程。但是,由于Java程序员可以提供UncaughtException处理程序,因此行为可能与终止线程的默认行为完全不同。



 类似资料:
  • 本文向大家介绍Java中错误和异常之间的区别,包括了Java中错误和异常之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解错误和异常之间的区别。 错误 它被分类为未检查类型。 它属于类'java.lang.error'。 无法从中恢复。 它不能在编译时发生。 错误的例子包括- 'OutOfMemoryError' ``IOError'' 例外 它可以分为未检查的异常和已检查的

  • 本文向大家介绍Java中异常和错误之间的区别,包括了Java中异常和错误之间的区别的使用技巧和注意事项,需要的朋友参考一下 异常和错误都是Throwable类的子类。该错误表示主要由于缺少系统资源而导致的问题,我们的应用程序不应捕获这些类型的问题。错误的一些示例是系统崩溃错误和内存不足错误。错误大多发生在运行时,因为它们属于未经检查的类型。  异常是在运行时和编译时可能发生的问题。它主要发生在开发

  • 问题内容: 我试图学习有关基本Java和不同类型的Throwables的更多信息,有人可以让我知道Exception和Errors之间的区别吗? 问题答案: 错误不应该被发现或处理(在极少数情况下除外)。异常是异常处理的基础。该Javadoc中解释说得好: 错误是Throwable的子类,它指示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。 查看一些的子类Error,并获取一些J

  • 本文向大家介绍Java中检查和未检查异常之间的区别,包括了Java中检查和未检查异常之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解Java中已检查和未检查的异常之间的区别。 检查异常 它们在编译时发生。 编译器检查已检查的异常。 这些异常可以在编译时进行处理。 它是异常类的子类。 JVM要求捕获并处理异常。 已检查异常的示例-“找不到文件异常” 未检查的异常 这些异常在运

  • 问题内容: 是图像文件的字符串。 我在C#中具有以下代码: 和Java中的代码如下: 结果是不同的。 有人说是因为 Java字节:-128至127 C#字节:0到255 但是我该如何解决呢?如何在Java中实现C#?通过使用Java,我需要与C#中相同的结果。 问题答案: 您正在对 字符串进行 base64编码吗?你想做什么?您首先需要将字符串转换为字节序列,然后选择一种编码,例如UTF-8或UT

  • 本文向大家介绍Java 中的异常处理?相关面试题,主要包含被问及Java 中的异常处理?时的应答技巧和注意事项,需要的朋友参考一下  Java异常类层次结构图 在 Java 中,所有的异常都有一个共同的祖先java.lang包中的 Throwable类。Throwable: 有两个重要的子类:Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大