2013-08-20 4 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) или лучший выбор передачи нулевого значения против пустого ArrayList или запрос о точках ошибки [The Billion Dollar Mistake] (http://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare) будет более подходящим для P.SE (хотя посмотрите, есть и другие вопросы по этой теме). –

+0

Как в сторону, особенно для этого кода, посмотрите на [StringBuilder] (http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html), а не на 'prevRands + = Integer.toString (...); 'Вероятно, вы создаете и отбрасываете много ненужных строк. –

ответ

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

корабль [г] пусто (нуль), так вот почему вы получите ошибку. Вам необходимо заполнить анкету массив первым.

Важно: корабля массив хранит ссылки не объектов, так вот почему вы должны заполнить его первым. Так

Ship[] ship = new Ship[10] 

магазины 10 кораблей ссылки (который начинается как нуль), фактическая Ship объектов необходимо назначить самостоятельно.

3

Вы создали массив в этой строке:

Ship[] ship = new Ship[numShips]; 

Но все элементы null, поэтому NullPointerException результатов на этой линии:

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

Вам нужно назначить Ship объектов места ваш массив, что-то вроде этого:

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

Да, я на самом деле решил ошибку самостоятельно, и вы правы. Вместо этого я просто создал переменную count int и увеличил ее каждый раз, когда я фактически назначил корабль var новому объекту корабля. Я заменил число в цикле for со счетом, таким образом, он знает, сколько объектов кораблей действительно имеет ссылку из массива. –

2

Вы должны инициализировать каждый элемент массива:

ship[z] = new Ship(); 

Btw, вы должны использовать имена методов, которые начинаются с строчными буквами, это стандартный