簡體   English   中英

NullPointerException:覆蓋Derived類中的Base類的構造函數調用方法

[英]NullPointerException : Overriding constructor calling method of Base class in Derived class

我有這段代碼:

class Base {
    public Base() {
        method();
    }

    void method() {
        System.out.println("In Base");
    }
}

class Derived extends Base {
    private String bar;

    public Derived() {
        bar="bar";
    }

    public void method() {
        System.out.println(bar.length());
    }

    public static void main(String[] args) {
        Base base=new Derived();
        base.method();
    }
}

在執行代碼時,我得到了一個異常:

Exception in thread "main" java.lang.NullPointerException
    at Derived.method(Main.java:22)
    at Base.<init>(Main.java:5)
    at Derived.<init>(Main.java:17)
    at Derived.main(Main.java:27)

我無法理解為什么有NullPointerException和異常的stackTrace 有人可以幫我理解嗎?

你可以在這里查看代碼。

new Derived()創建一個Derived對象,這意味着首先調用它的超類構造函數,然后調用method - 但是你有覆蓋method所以它是被調用的那個方法的子版本。 在該方法中,您調用尚未初始化的bar.length

結論:在構造函數中調用可覆蓋的方法幾乎絕不是一個好主意。

您提供的代碼是反模式 我們永遠不應該從constructor調用方法處理字段,原因很簡單,它可能會產生意外結果

從您的代碼中,您正在嘗試在Derived構造函數中初始化一個名為bar的字段。 現在,當你說Base b = new Derived() ,調用會以下列方式發生

  1. 基本靜態初始化程序 - 如果有的話
  2. 派生的靜態初始化程序 - 如果有的話

  3. 基本塊初始化程序 - 如果有的話

  4. Base Constructor - >這是你調用method()的地方method()

  5. 派生塊初始化程序 - 如果有的話

  6. 派生構造函數 - >這是您初始化bar的位置

現在由於運行時多態性 ,在4號中,當Derivedmethod()被調用時, bar尚未初始化為值"bar" (因為初始化發生在第6位),NPE發生

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM