2012-11-11 38 views
0

感覺像是一個超級基本問題,但我無法用頭來包圍它。Java - 爲null對象的字段賦值或聲明沒有構造函數的對象不爲null

有一個PriceGroup類,沒有構造函數,我正在創建一個對象。

class SmallPortfolio{ 
String id; 
// all the investments (stocks) belonging to this portfolio. 
List<Investment> invList = new ArrayList<Investment>(); 
} 

現在在一個單獨的類中,創建一個名爲Spor的SmallPortfolio對象。

// 
String id = InstanceID.getTextNormalize(); //this value is taken from an element from jdom. 
SmallPortfolio Spor; 
Spor.id = id; 
//some code that creates a list of investments 
//some code that creates a list of SmallPortfolio objects 

在java中,你如何給null對象的字段值得到NullPointerException? 另一種解決方案是以某種方式聲明一個不爲null的SmallPortfolio對象。

這是一個奇怪的問題,但我使用的測試程序無法修改,它沒有SmallPortfolio的構造函數。

回答

2

所有你需要做的是初始化斯波爾:

SmallPortfolio Spor = new SmallPortfolio(); 

這將創建一個非空的對象。另外,如果你打算在每次初始化之後添加一個id,你可以將它添加到構造函數中。希望有所幫助!

4

除非您自己定義一些構造函數,否則Java將自動爲您創建一個默認的無參數構造函數。所以,你可以寫:

SmallPortfolio smallPort = new SmallPortfolio(); 

然而,在你的情況,應該可能已經提供的SmallPortfolio類的作者的ad-hoc構造:

class SmallPortfolio{ 
    private final String id; 
    // all the investments (stocks) belonging to this portfolio. 
    private final List<Investment> investments = new ArrayList<Investment>(); 

    public SmallPortfolio(String id) { 
     this.id = id; 
    } 

    //getters + methods to add/remove investments 
} 
1

Spor從不初始化:

SmallPortfolio Spor; 

替換爲:

SmallPortfolio Spor = new SmallPortfolio(); 
1

問題有點不清楚,但如果您問是否可以在空對象上分配字段或調用方法,那麼不,您不能。您需要擁有(或製作)您班級的實例。

SmallPortfolio Spor = new SmallPortfolio(); 
Spor.id = id; 

你上面顯示甚至不應該編譯,因爲你還沒有分配一個值(甚至不爲空),以Spor的代碼。 (如果您確實分配了null,則會得到運行時空指針異常)。

如果混淆是如何在沒有構造函數的情況下創建對象:在這種情況下,有一個,因爲如果Java代碼沒有指定任何構造函數(但只有那樣),則會有一個自動默認構造函數不需要參數。

+0

如果這些代碼是字段聲明而非局部變量聲明,則給出的代碼將被編譯。 –

+0

@JonSkeet:這是正確的。但是,第三行('Spor.id = id;')不能在塊外部使用,而第一行('String id = InstanceID.getTextNormalize();')可能用於字段聲明,看起來不是。 – Thilo

+0

良好的捕獲 - 沒有看到這一點。 (這對OP的術語非常困惑:「你如何給一個空對象的字段賦值」,這表明他們可以對變量,值,引用,對象等進行重要的教訓。) –