首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果(!this) { return false;}

如果(!this) { return false;}
EN

Stack Overflow用户
提问于 2009-03-19 17:59:58
回答 7查看 2K关注 0票数 10

我偶然发现了这段代码,这段代码对我来说似乎完全崩溃了,但它确实是thisnull。我就是不明白这怎么会是null

它在一个普通的方法调用中,比如

代码语言:javascript
复制
myObject->func();

MyObject::func()内部,我们有

代码语言:javascript
复制
if (!this) { return false; }

有没有办法让我的第一行抛出NullPointerException,而不是进入null(?)方法?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-03-19 18:04:13

如果您有:

代码语言:javascript
复制
MyObject *o = NULL;

o->func();

接下来会发生什么取决于func是否是虚拟的。如果是,那么它将崩溃,因为它需要一个对象来获取vtable。但是如果它不是虚拟的,那么调用就会将this指针设置为NULL。

我相信标准说这是“未定义的行为”,所以任何事情都可能发生,但典型的编译器只是生成代码而不检查指针是否为空。一些众所周知的库依赖于我所描述的行为: MFC有一个类似SafeGetHandle的函数,可以在空指针上调用,在这种情况下返回null。

您可能想要编写一个可重用的助手函数:

代码语言:javascript
复制
void CheckNotNull(void *p)
{
    if (p == NULL)
        throw NullPointerException();
}

然后,可以在函数的开头使用它来检查它的所有参数,包括this

代码语言:javascript
复制
CheckNotNull(this);
票数 22
EN

Stack Overflow用户

发布于 2009-03-19 18:12:12

捕获此类错误的一种方法(通过设计)是使用指针包装器类(类似于shared_ptr),该类在创建时使用空指针参数抛出。它可能也会在解除引用时抛出,但有点晚了--我想,总比什么都没有好。

票数 2
EN

Stack Overflow用户

发布于 2009-03-19 18:03:18

代码语言:javascript
复制
if(this == null)
   throw new NullPointerException;
if(!this)
   return false;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/663326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档