2013-08-20 121 views
1

我不斷收到此錯誤:如何解決返回一個數組爲空數組的Java

Exception in thread "main" java.lang.NullPointerException at BattleshipCMDGame.GenerateShips(BattleshipCMDGame.java:33) at BattleshipCMDGame.main(BattleshipCMDGame.java:7)

所有我想要做的就是在我的方法新創建的類類型數組的形式返回到創建一個空數組主要方法。這裏是我的代碼:

import java.util.*; 

public class BattleshipCMDGame 
{ 
public static void main(String[] args) 
{ 
    Ship[] ship = GenerateShips(3); 
    Scanner in = new Scanner(System.in); 

    for (int i = 0; i < ship.length; i++) 
    { 
     System.out.println(ship[i].GetName() + " : Location - " + ship[i].GetLocation()); 
    } 
} 

public static Ship[] GenerateShips(int numShips) 
{ 
    Ship[] ship = new Ship[numShips]; 
    Random rand = new Random(); 
    int randLoc; 
    String prevRands = ""; 
    String randToString = ""; 

    for (int i = 0; i < ship.length; i++) 
    { 
     randLoc = 1 + rand.nextInt(7); 
     randToString = Integer.toString(randLoc); 

     for (int z = 0; z < ship.length; z++) 
     { 
      prevRands = ""; 

      if (ship[z].GetLocation() != 0) 
      { 
       prevRands += Integer.toString(ship[z].GetLocation()); 
      } 
     } 

     while (prevRands.contains(randToString)) 
     { 
      randLoc = 1 + rand.nextInt(7); 
      randToString = Integer.toString(randLoc); 
     } 

     ship[i] = new Ship("Ship no. " + (Integer.toString(i)), randLoc); 
    } 

    return ship; 
} 
} 
+0

什麼是線33? –

+0

正如遷移所指出的那樣,實施問題最好在SO而不是P.SE上處理。使用[null pattern](http://en.wikipedia.org/wiki/Null_Object_pattern)的問題,或傳遞null與空ArrayList的最佳選擇,或詢問[The Billion Dollar Mistake]中的點( http://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare)對P.SE更合適(雖然看起來,還有關於這個話題的其他問題)。 – 2013-08-20 18:13:41

+0

順便說一句,特別是此代碼,請看[StringBuilder的](http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html),而不是做'prevRands + = Integer.toString(...);'你可能會創建並丟棄大量不必要的字符串。 – 2013-08-20 18:15:35

回答

3
if (ship[z].GetLocation() != 0) 

船[Z]爲空(NULL),所以這就是爲什麼你的錯誤。 你需要先填寫你的

最重要的是:數組存儲引用對象,所以這就是爲什麼你需要先填充它。所以

Ship[] ship = new Ship[10] 

店10 船舶引用(該程序可以),實際船舶的對象,你需要自己來分配。

3

您已經創建了該行的數組:

Ship[] ship = new Ship[numShips]; 

但所有的元素都是null,所以NullPointerException結果在這條線:

if (ship[z].GetLocation() != 0) 

您需要分配Ship對象在位置你的陣列,像這樣:

ship[z] = new Ship(); 
+0

是的,我真的解決了我自己的錯誤,你是對的。相反,我只是創建了一個int count變量,並在每次我將一個ship var分配給一個新的ship對象時增加它。我用count替換了一個for循環中的數字,這樣它就知道有多少個船隻對象實際上有數組的引用。 –

2

您應該初始化數組的每一個元素:

ship[z] = new Ship(); 

順便說一句,你應該使用方法名稱以小寫開頭,這是標準的

相關問題