c java 异常_C ++和Java中的异常处理之间的区别?

小编典典

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

2020-12-03

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值