2013-11-30 5 views
4

Каждый раз, когда я называю myGrid в методе generateBoard, я получаю ошибку:Как ссылаться на 2D-массив из статического контекста?

non-static variable myGrid cannot be referenced from static context

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

import java.util.Random; 

public class Zombies { 
    private int Level = 1; 
    private int MoveNo = 0; 
    public int[][] myGrid = new int[12][12]; 

    public static void generateBoard() { 
     Random rand = new Random(); 
     int i, j; 
     for (i = 0; i < 12; i++) { 
      for (j = 0; j < 12; j++) { 
       if (i == 6 && j == 6) { 
        myGrid[i][j] = 'P'; 
       } 
       if (rand.nextInt(4) == 0) { 
        myGrid[i][j] = 'I'; 
       } 
       myGrid[i][j] = 'x'; 
      } 
     } 
    } 

    public static String printBoard() { 
     int i, j; 
     for (i = 0; i < 12; i++) { 
      for (j = 0; j < 12; j++) { 
       if (j == 0) { 
        System.out.print("| "); 
       } 
       System.out.print(myGrid[i][j] + " "); 
       if (j == 12) { 
        System.out.print("|"); 
       } 
      } 
     } 
    } 
} 
+0

В будущем выделите (со словами) строку, обозначенную сообщением об ошибке. Будет намного легче начать работу по этому вопросу. –

ответ

3

myGrid переменная - это переменная экземпляра, а не переменная класса. То есть к нему можно получить доступ только с помощью экземпляра Zombies. С другой стороны, статические методы (и class, a.k.a. static, variables) относятся к классу, которые совместно используются в этом случае среди всех экземпляров Zombies.

Либо передайте myGrid (int[][]) в качестве параметра каждому из этих статических методов, либо объявите его как static.

+0

Как объявить массив как статический? Просто 'public static int [] [] myGrid = new int [12] [12];' ? – Stormie

+0

Да, как вы писали. Однако в то же время помните, что в зависимости от вашего дизайна массив может передаваться по параметру этим методам, или 2D-массив может быть объявлен как переменная класса (статическая). Если вы хотите создать экземпляр статического массива (возможно, вы хотите заполнить значения с помощью 10 до того, как ваши статические методы начнут работать над ним), по какой-либо причине во время объявления вы можете использовать статический блок. – Malvon

+0

Да, он используется в качестве игрового поля, поэтому я думаю, что было бы лучше иметь его статически доступным. – Stormie

Смежные вопросы