【问题标题】:Why finalize is not giving null pointer exception in the below code?为什么 finalize 在下面的代码中没有给出空指针异常?
【发布时间】:2018-09-23 09:57:32
【问题描述】:

为什么当对象为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 : 完成调用0 完成调用10

【问题讨论】:

  • 哪一部分应该给NPE?如果您希望 this 成为 null,那在任何时候都是不可能的。
  • f1=null; f2=空;您能否解释一下,即如果 f1 和 f2 为 null 那么为什么在 finalize 中没有 NPE 到来?
  • 是吗?您设置了 2 个对 null 的引用。如您所见,您的 finalize() 方法不会尝试访问其中任何一个(或者您在其中看到 f1f2 吗?)。
  • 那为什么输出是:finalize called0 finalize called10 ?
  • 因为你设置了f1.a = 10所以f1的finalize输出finalize called10。 f2.a == 0(int 的默认值)并且它的最终确定是输出 finalize called0

标签: java garbage-collection finalize


【解决方案1】:
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**
}}

输出 ->

f1 =null f2 = null

低于 gc

最终确定被调用0 最终确定被调用10

线程“main”中的异常 java.lang.NullPointerException at basic.Person.main(Person.java:19)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      对象不能为空,只能是引用。

      仅仅因为您将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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多