在类方法中看到了这行代码,我的第一反应是嘲笑编写它的开发人员。
public void dataViewActivated(DataViewEvent e) {
if (this != null)
// Do some work
}
那行会否评估为假?
在类方法中看到了这行代码,我的第一反应是嘲笑编写它的开发人员。
public void dataViewActivated(DataViewEvent e) {
if (this != null)
// Do some work
}
那行会否评估为假?
Answers:
不,它不能。如果您使用this
,那么您就在实例中,所以this
它不是null。
JLS说:
当用作主要表达式时,关键字this表示一个值,该值是对其调用实例方法的对象(第15.12节)或正在构造的对象的引用。
如果从对象调用方法,则该对象存在或将具有NullPointerException
before(或它是静态方法,但不能this
在其中使用)。
资源:
this
,实例方法可以为NULL。因此,我不太相信这是Java中充分的理由。
foo.bar()
时,将抛出null指针异常。它确实在输入方法之前发生,但是真实的故事是没有尝试调用的方法。foo
null
this
关键字并进行编译,则在观察时它不为null。但是就像其他人所说的那样,这在尝试调用该方法时不会阻止NPE,例如,但这完全超出了您的控制范围,并且该方法中的空检查不会改变任何内容。
这就像在问自己“我还活着吗?” this
永远不能为空
this != null
不言而喻。对于非虚拟方法,例如,在C ++中this
可能NULL
不是。
永远不会,关键字“ this”本身表示该类范围内该类的当前活动实例(对象),您可以使用该实例访问其所有字段和成员(包括构造函数)以及其父类的可见字段。
而且,更有趣的是,尝试设置它:
this = null;
考虑一下吗?怎么可能,就像剪掉您坐在的树枝一样。由于关键字“ this”在类的范围内可用,因此只要您说this = null即可;在类中的任何位置,您基本上都是在要求JVM在某个操作的中间释放分配给该对象的内存,而JVM不允许发生这种情况,因为它需要在完成该操作后安全地返回。
此外,尝试this = null;
将导致编译器错误。原因很简单,Java(或任何语言)中的关键字永远不能被赋值,即关键字永远不能是赋值操作的左值。
其他示例,您不能说:
true = new Boolean(true);
true = false;
this = null
。我的实例在android中,我想删除一个视图并将处理该视图的对象设置为null。然后,我想使用一种方法remove()
来删除实际视图,然后使处理程序对象变得无用,因此我想将其为空。
如果使用-target 1.3
或更早版本进行编译,则外部 this
可能为null
。或者至少它曾经...
Outer.this.member
语言强制执行它是不够的。VM需要执行它。除非VM强制执行,否则您可以编写在调用用Java编写的方法之前不强制执行null检查的编译器。实例方法调用的操作码包括将此引用加载到堆栈上,请参见:http : //java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14787。将其替换为空引用确实会导致测试为假
普通this
永远不能出现null
在真实的Java代码1中,您的示例使用了普通的Java代码this
。有关更多详细信息,请参见其他答案。
一个合格的this
人永远都不能成为null
,但是有可能打破它。考虑以下:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
当我们要创建的实例时Inner
,我们需要这样做:
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.new Inner();
System.out.println(inner);
outer = null;
inner = outer.new Inner(); // FAIL ... throws an NPE
}
输出为:
outer is Outer@2a139a55
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
这表明我们试图建立一个Inner
具有null
参考其Outer
失败。
实际上,如果您坚持使用“ Pure Java”信封,则不能破坏它。
但是,每个Inner
实例都有一个隐藏的final
合成字段(称为"this$0"
),其中包含对的引用Outer
。如果您真的很棘手,则可以使用“非纯”方式分配null
给该字段。
Unsafe
用来做。无论采用哪种方式,最终结果都是该Outer.this
表达式的计算结果为null
2。
总之,这是可能的有资格的this
是null
。但是,如果程序遵循“纯Java”规则,则是不可能的。
1-我不喜欢技巧,例如用手“编写”字节码并将其作为真正的Java传递出去,使用BCEL或类似方法调整字节码,或者跳入本机代码并使用已保存的寄存器进行处理。IMO,那不是Java。假设,这种情况也可能是由于JVM错误而发生的……但是我不记得每个看到的错误报告。
2-实际上,JLS并未说明行为将是什么,它可能取决于实现...等等。