java因構造順序引起的隱蔽異常

代碼以下:
public abstract class Father_Test
{
public Father_Test()
{
System.out.println(createString());
}
public abstract String createString();
public static void main(String[] args)
{
new Son();
}
}

class Son extends Father_Test
{
private String str="chong";
@Override
public String createString()
{
// TODO Auto-generated method stub
return str.substring(0, 1);
}
}

乍一看代碼寫的沒有問題,但是一運行就出現了NullPointerException的異常?那麼異常究竟出如今什麼地方呢?爲何會出現呢?
問題出在構造函數的初始化順序上。咱們應該知道當構造函數的初始化過程,結合上面代碼,當咱們調用子類的構造函數時,java會先調用父類的構造函數以便先對父類中的各成員進行初始化,而父類構造函數中又調用了 createString()方法,java發現此方法是個抽象方法時會往子類中去找,直到找到一個實現了上述方法的方法體,這就是Son類中的 createString()方法,而此方法的返回值是 str.substring(0, 1)。問題就出在這裏,由於各成員(也就是這裏的str)還未初始化,子類中的構造函數還未執行到,那麼此時的str應爲null,那麼出現空指針異常也就不足爲奇了......
相關文章
相關標籤/搜索