为什么finalize不在下面的代码中给出空指针异常?

时间:2018-04-13 06:00:57

标签: java garbage-collection finalize

当对象变为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

3 个答案:

答案 0 :(得分:1)

对象永远不会为空,这是无意义的。引用可以为null,对象可以被销毁(因此)。

f1f2不是对象,它们是对象的引用。当您编写f1=null时,这意味着此引用不再指向任何对象,并且先前指向的对象具有较少的引用。垃圾收集(粗略地)跟踪您对所做引用的所有操作,并且当不再引用对象时,它们首先被放入一些垃圾中,然后在需要时被回收或销毁,但是即使在该阶段也存在对象。当回收/销毁时,机器将在回收/销毁之前调用finalize,然后在调用finalize时存在对象(如果没有,如何在finalize上调用对象?)。

答案 1 :(得分:1)

不能将对象设为null,只能引用。

仅仅因为您将f1f2设置为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)