为什么我们需要在C ++中检查空指针,而不是在Java中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我们需要在C ++中检查空指针,而不是在Java中?相关的知识,希望对你有一定的参考价值。

据说,我有一个名为RequestType的类。在Java中,代码往往不会检查新对象是否为null引用:

RequestType request = new RequestType();
// if (request == null)   // missing

但是C ++代码倾向于检查分配:

RequestType* request = new RequestType();
if (nullptr == request)      // check

为什么我们需要在C ++中检查requestType是否是nullptr,但是如果没有Java中的检查就可以使用它?

答案

你的前提是错误的(也许是平庸的样本)。

在这两种语言中,new运算符将成功或抛出异常(分别为java.​lang.​OutOfMemoryErrorstd::​bad_alloc)。所以从来没有必要像这样检查新分配的对象。 (请注意,我在谈论标准C ++ - 一些古老的标准前编译器将返回null而不是抛出)。

当函数接收到其控制之外的参数时,防御性程序员通常会检查Java引用和C ++指针,这两者都可以为null。使用C ++引用是如此的防御是不常见的,因为隐式契约是我们不在C ++中创建空引用。


摘要

  • Java中新分配的对象永远不能为null: Request request = new Request(); // request cannot be null 也不是用C ++: Request* request = new Request(); // request cannot be null
  • Java中的函数参数或返回值可能为null: void processRequest(Request request) { // request might be null String body = request.body(); // body might be null 在C ++中: void processRequest(const Request *request) { // request might be null const char *body = request->body(); // body might be null void processRequest(const Request& request) { // &request assumed non-null std::string body = request.body(); // body can't be null (it's not a pointer)
另一答案

在Java中,以下语句显式创建对象,除非它是默认构造函数,否则它永远不会是null

RequestType requestType = new RequestType();

但是,如果您正在接收此对象作为方法参数,或者在return语句中,或者您的构造函数在创建此对象时正在做一些逻辑,则有可能,它可以是null

所以,在java中,你需要检查你的对象是否是null

以上是关于为什么我们需要在C ++中检查空指针,而不是在Java中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥指针可以为NULL

空指针是啥意思

C中指向char的指针的默认值

C - 为什么指针常常初始化为 NULL?

C - 为什么指针常常初始化为 NULL?

小米手机获取手机信息返回空消息