我偶然发现了这段代码,这段代码对我来说似乎完全崩溃了,但它确实是this的null。我就是不明白这怎么会是null
它在一个普通的方法调用中,比如
myObject->func();在MyObject::func()内部,我们有
if (!this) { return false; }有没有办法让我的第一行抛出NullPointerException,而不是进入null(?)方法?
发布于 2009-03-19 18:04:13
如果您有:
MyObject *o = NULL;
o->func();接下来会发生什么取决于func是否是虚拟的。如果是,那么它将崩溃,因为它需要一个对象来获取vtable。但是如果它不是虚拟的,那么调用就会将this指针设置为NULL。
我相信标准说这是“未定义的行为”,所以任何事情都可能发生,但典型的编译器只是生成代码而不检查指针是否为空。一些众所周知的库依赖于我所描述的行为: MFC有一个类似SafeGetHandle的函数,可以在空指针上调用,在这种情况下返回null。
您可能想要编写一个可重用的助手函数:
void CheckNotNull(void *p)
{
if (p == NULL)
throw NullPointerException();
}然后,可以在函数的开头使用它来检查它的所有参数,包括this
CheckNotNull(this);发布于 2009-03-19 18:12:12
捕获此类错误的一种方法(通过设计)是使用指针包装器类(类似于shared_ptr),该类在创建时使用空指针参数抛出。它可能也会在解除引用时抛出,但有点晚了--我想,总比什么都没有好。
发布于 2009-03-19 18:03:18
if(this == null)
throw new NullPointerException;
if(!this)
return false;https://stackoverflow.com/questions/663326
复制相似问题