当对象变为null时,为什么下面的代码在finalize方法中没有给出空指针异常?
class Person{
public int a;
public void finalize(){
//System.out.println("finalize called"+this.hashCode());
System.out.println("finalize called"+this.a);
}
public static void main(String[] args){
Person f1=new Person();
f1.a=10;
Person f2=new Person();
f1=null;
f2=null;
System.gc();
}}
O / P:finalize called0 敲定召唤10
答案 0 :(得分:1)
对象永远不会为空,这是无意义的。引用可以为null,对象可以被销毁(因此)。
f1
和f2
不是对象,它们是对象的引用。当您编写f1=null
时,这意味着此引用不再指向任何对象,并且先前指向的对象具有较少的引用。垃圾收集(粗略地)跟踪您对所做引用的所有操作,并且当不再引用对象时,它们首先被放入一些垃圾中,然后在需要时被回收或销毁,但是即使在该阶段也存在对象。当回收/销毁时,机器将在回收/销毁之前调用finalize
,然后在调用finalize
时存在对象(如果没有,如何在finalize
上调用对象?)。
答案 1 :(得分:1)
不能将对象设为null,只能引用。
仅仅因为您将f1
和f2
设置为null,并不意味着finalize()
会抛出NPE
。它正在访问永远不能为空的this
引用。
f1 --> Object <-- (implicit this accessible from inside the instance)
f2 --> Object <-- (--""--)
f1 = null; f2 = null;
Object <-- (implicit this) previously f1 referred to this Object
Object <-- (implicit this) previously f2 referred to this Object
答案 2 :(得分:0)
class Person{
public int a;
public void finalize(){
//System.out.println("finalize called"+this.hashCode());
System.out.println("finalize called"+this.a);
}
public static void main(String[] args){
Person f1=new Person();
f1.a=10;
Person f2=new Person();
f1=null;
f2=null;
System.out.println("f1 =" + f1 + " f2 = " + f2);
System.gc();
System.out.println("Below gc");
System.out.println();
System.out.println(f1.a);// **here O/P - NPE**
}}
OUTPUT - &gt;
f1 = null f2 = null
gc以下
finalize called0 finalize called10
线程“main”中的异常java.lang.NullPointerException at basic.Person.main(Person.java:19)