2010-10-23 60 views
2

我設置一個Java類獲得的NullPointerException Java類

這裏面變量時有一個問題訪問變量的時候是我的代碼

這是我創建的實例(IdeaInfo是一個類,作用類似於一個結構):

IdeaInfo[] IDEAS = new IdeaInfo[100]; 
String[] TITLES = new String[100]; 

這是將使用的那些情況下的功能:

try { 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
      // This is adding title to array Ideas and Titles 
      if(mode % 3 == 0) { 
       IDEAS[ideas_pos].setTitle(sb.toString()); 
       TITLES[titles_pos] = sb.toString(); 
       titles_pos++; 
       mode++; 
      } 
      // This is adding the content to array Ideas 
      else if(mode % 3 == 1) { 
       IDEAS[ideas_pos].mContent = sb.toString(); 
       mode++; 
      } 
      // This is adding the rating to array Ideas 
      else if(mode % 3 == 2) { 
       IDEAS[ideas_pos].mRating = Float.valueOf(sb.toString().trim()).floatValue(); 
       ideas_pos++; 
       mode++; 
      } 
     } 
    } 

這是我IdeaInfo類中:

public class IdeaInfo { 

    public String mTitle = new String();  // Store the Idea's title 
    public String mContent = new String(); // Store the Idea's title 
    public float mRating;  // Store the Idea's Rating 

    /* 
    * Function that set the Idea's title 
    */ 
    public void setTitle(String temp){ 
     mTitle = temp; 
    } 
} 

顯然,在try內發生的錯誤,正是在IDEAS[ideas_pos].setTitle(sb.toString()); 調試表明,我訪問一個NullPointerException,這並不真正使任何意義,我因爲我已經初始化了這些變量。

順便說一句,我初始化ideas_pos爲0

+0

順便說一句,你可以用''「'替換'new String()'。 – 2010-10-24 00:16:55

回答

1

陣列被初始化「乾淨」的,也就是說,與所有元素設置爲null或「零」(無論是適當的陣列的類型)。當你寫

IdeaInfo[] IDEAS = new IdeaInfo[100]; 

JVM將對待它,如果你寫

IdeaInfo[] IDEAS = new IdeaInfo[100]; 
for (int i = 0; i < 100; i++) { 
    IDEAS[i] = null; 
} 

這需要一些時間來適應,如果你是從哪個有不同的約定如C或C語言++轉向Java初始化數組。

7

當你初始化數組,這並不意味着你已經初始化它的成員。

IDEAS[x]null。您需要將其初始化爲:

IDEAS[ideas_pos] = new IdeaInfo(); 
2

它看起來像列表中的項目爲空。嘗試追加:

if(IDEAS[ideas_pos] == null) { 
    IDEAS[ideas_pos] = new IdeaInfo(); 
} 

同樣適用於標題。

3

我討厭這麼說,但你的代碼應該重新設計和重寫。

  1. 對於開始sb.append(text + "/n")StringBuilder。用一個完整的濫用:sb.append(text).append('\n')
  2. 您永遠不會清除或創建新的StringBuilder,當您到達Float.valueOf()部件時,您的構建器將會附加大量文本。
  3. 我建議創建的0開關部件和存儲陣列中的IdeaInfo以便以後可以參考它的價值
  4. IdeaInfo - 不創建空字符串(喜歡簡單地分配"")。
0

Sammm

  1. 如以上,則需要爲每個陣列 「時隙」 創建IdeaInfo實例。提供公共訪問器(或者更好的方法是在類上正確執行 - get/set方法是EVIL!)。 封裝是OO中的第一個金科玉律。

    • 問自己會發生什麼,當你需要改變的IdeaInfo實行6個月的時間,你有很多其他的代碼直接取決於(改變)的成員變量狀態 - 你有一個維修頭痛!
    • 封裝數據使得推理關於任何類更容易 - 你知道狀態如何改變(通過方法只) - 類更容易得到正確。
  2. 初始化字符串數據字段爲「」,不new String()其浪費存儲器(所有空字符串將引用一個單獨的字符串對象)。在Java

相關問題