Java中的"this"可以为null吗?

Bry*_*her 108 java this

在一个类方法中看到这一行,我的第一反应是嘲笑编写它的开发人员..但是,我认为我应该确保我是对的.

public void dataViewActivated(DataViewEvent e) {
    if (this != null)
        // Do some work
}
Run Code Online (Sandbox Code Playgroud)

那条线路会被评估为假吗?

Col*_*ert 87

不,它不能.如果你正在使用this,那么你在实例中所以this不是null.

JLS说:

当用作主表达式时,关键字this表示一个值,该值是对调用实例方法的对象(第15.12节)的引用,或者是对正在构造的对象的引用.

如果你从一个对象调用一个方法,那么该对象就存在了,或者你有一个NullPointerExceptionbefore(或者它是一个静态方法,但是你不能this在其中使用).


资源:

  • @KennyTM:Java就足够了.如果您正在使用`this`关键字并进行编译,则在观察它时它不是null.但正如其他人所说,在尝试调用方法时并不会阻止NPE,例如,但这完全超出了您的控制范围,并且方法中的空检查不会改变任何内容. (5认同)
  • @Kenny:不是没有[未定义的行为](http://stackoverflow.com/q/1844005/54262),但如果你知道你的实现的细节,你可以使用它. (5认同)
  • 我不太了解Java,但在C++中,实例方法的`this`可能是NULL.所以我不太相信这是Java的充分理由. (4认同)
  • 当`foo`被发现为`null`时,会抛出类似`foo.bar()`的空指针异常.它确实发生在进入方法之前,但真正的故事是没有方法可以尝试调用. (4认同)
  • 即使它完全合理,我也不会赞同这个明确的答案.我有一个Android应用程序的崩溃报告,当变量从另一个线程返回null后立即调用实例方法时,这个== null.即使变量为null,实际调用也会通过,并且当它尝试读取实例成员时它会崩溃:) (4认同)
  • @Rune FS然后,它还是java吗?(作为一种语言) (3认同)
  • @Mark Peters:什么用法可能无法编译?在静态类中使用是我现在唯一能想到的. (2认同)

bra*_*boy 63

这就像在问自己"我还活着吗?" this永远不会为空

  • _am_我活着吗?!哦,上帝,我不知道了 (44认同)
  • @John:你是.部分折磨是你无法证实的. (8认同)
  • 我思故我在 (7认同)
  • @nikie 从某种意义上说,这是不言而喻的。即使在 C++ 中,任何发生这种情况的程序都有未定义的行为。GCC 上的虚拟函数也可能发生这种情况:http://ideone.com/W7RmU。 (2认同)

sac*_*tiw 9

从来没有,关键字"this"本身表示该类范围内该类的当前活动实例(对象),您可以使用该实例访问其所有字段和成员(包括构造函数)及其父类的可见实例.

而且,更有趣的是,尝试设置它:

this = null;
Run Code Online (Sandbox Code Playgroud)

想一想吗?怎么可能,就像削减你所坐的分支一样.由于关键字"this"在类的范围内可用,因此只要你说this = null; 在类中的任何地方,你基本上都要求JVM在某些操作过程中释放分配给该对象的内存,JVM不允许这样做,因为它需要在完成该操作后安全返回.

此外,尝试this = null;将导致编译器错误.原因很简单,Java(或任何语言)中的关键字永远不会被赋值,即关键字永远不能是赋值操作的左值.

其他例子,你不能说:

true = new Boolean(true);
true = false;
Run Code Online (Sandbox Code Playgroud)


Tom*_*ine 7

如果您使用-target 1.3或更早编译,那么外部 this可能是null.或者至少过去......

  • 我想通过反射我们可以将外部设置为null.当他在引用"Outer.this.member"时得到空指针异常时,可能是一个愚人节玩笑 (2认同)