2014-11-25 32 views
0

我想給一個叫做State的類的每個子項賦值,而我有一個初始狀態爲空的狀態數組,我在這裏接收空指針引用:當初始化一個空值項時出現空指針異常

//finding all the neighbor states of a given configuration 

public State[] neighborStates(String config, int modeFlag){ 
    State[] neighborStates=new State[7]; 
    int i=0; 
    for (Operation o : Operation.values()){ 
     neighborStates[i].config=move(config,o.name().charAt(0)); 
     neighborStates[i].realCost++; 
     neighborStates[i].opSequence+=o.name(); 
     neighborStates[i].heuristicCost=getHeuristicCost(neighborStates[i].config, modeFlag); 
     i++; 
    }  

    return neighborStates; 
} 

我改變了代碼,但我還沒有得到NPE:

public State[] neighborStates(String config, int modeFlag){ 
     State[] neighborStates=new State[8]; 
     int i=0; 
     for (Operation o : Operation.values()){ 
      neighborStates[i] = new State(move(config,o.name().charAt(0)),neighborStates[i].realCost++, 
           getHeuristicCost(neighborStates[i].config, modeFlag), neighborStates[i].opSequence+=o.name()); 
      //neighborStates[i].config=move(config,o.name().charAt(0)); 
      //neighborStates[i].realCost++; 
      //neighborStates[i].opSequence+=o.name(); 
      //neighborStates[i].heuristicCost=getHeuristicCost(neighborStates[i].config, modeFlag); 
      i++; 
     } 

類國家的定義是:

public class State { 
    public State(String config, int realCost, int heuristicCost, String opSequence){ 
     this.config = config; 
     this.realCost = realCost; 
     this.heuristicCost = heuristicCost; 
     this.opSequence = opSequence; 
    } 

回答

7

您需要在neighborStates陣列中實例化State(s)。你已經創建了一個有7個插槽的陣列,但它們都是最初的null。假設你有一個默認的構造函數,它應該是這個樣子,

for (Operation o : Operation.values()){ 
    neighborStates[i] = new State(); 
    // ... 

而且,它可能是一個好主意,基於Operation.values()

State[] neighborStates = new State[Operation.values().length]; 
+0

嗨艾略特,我更新了你說的代碼,但我還沒有得到NPE,請你看看? – 2014-11-25 03:32:26

+0

這不是我說的,你的「國家」從非構造者變成了一切?因爲State中的構造函數是 – 2014-11-25 03:34:24

+0

。java就像'public State(String config,int realCost,int heuristicCost,String opSequence)' – 2014-11-25 03:35:10

0

當你創建一個指定大小的數組大小neighborStates你用 State[] neighborStates = new State[7]你分配那個內存。數組中的每個索引都使用該類型的默認值進行初始化。布爾值的默認值是false。數字的默認值是0。以下是重要的部分:引用的默認值是null

所有數組中的值將是空的,直到你實例化他們,說neighborState[i] = new State();

0

當你寫這行代碼 國發[] neighborStates =新的國家[7];
您只收到一個數組對象的參考,其中的7個項目全部爲空,此行只初始化狀態數組對象,沒有任何項目。

因此,在for循環中,所有項目仍然爲空,您必須首先使用它初始化每個項目。 neighborStates [i] = new State();

-1

您只需要初始化一個數組,但是您尚未在State []數組中構建該成員。
在使用它之前,您需要調用構造函數來構造State類。 嘗試改變你這樣的代碼:

public State[] neighborStates(String config, int modeFlag){ 
    State[] neighborStates=new State[7]; 
    int i=0; 
    for (Operation o : Operation.values()){ 
     neighborStates[i] = new State(move(config,o.name().charAt(0)), 
             someRealCost, //what's the value of this parameter? 
             getHeuristicCost(config, modeFlag), 
             modeFlag 
            ); 
     .... 
     i++; 
    } 
} 
+0

在State.java中沒有State這樣的構造函數,我不應該改變State.java類!在問題 – 2014-11-25 03:53:09

+0

中提到的狀態的唯一構造函數你是對的,它應該使用State的唯一構造方法。 – chartsai 2014-11-25 03:56:20

+1

但是如何?你能修改你的代碼嗎? – 2014-11-25 03:57:09

0

對於你的問題的版本更新後

你正在評估這個表達式 -

new State(move(config,o.name().charAt(0)),neighborStates[i].realCost++, 
          getHeuristicCost(neighborStates[i].config, modeFlag), neighborStates[i].opSequence+=o.name());  

你有一個值分配給neighborStates[i]之前。所以說neighborStates[i].realCost++的部分正在觸發空指針異常 - neighborStates[i]仍然是null