нестатическая переменная, на которую нельзя ссылаться из статического контекста

Ошибка исходит из этой строки BoardState addme = new BoardState();

По какой-то причине нестатическая переменная, на которую он указывает, является «новой». Мне неясно, как я могу исправить эту ошибку, поскольку new не должна быть переменной и не является ею.

Просматривая записи stackoverflow, эта ошибка обычно возникает из-за нестатического метода, который обычно решается путем создания статического метода или полного обхода метода. Т

Этот код ниже предназначен для ссылки на то, что происходит до и после этого оператора.

public class IntelligentTicTacToe extends TicTacToe {

public class BoardState{
    public String TTTState;
    public int[][] defensiveOppsArray;
    public int[][] offensiveOppsArray;
    public String str;
    public int cnt;
}

public static ArrayList<BoardState> memory = new ArrayList<BoardState>();


public static boolean makeMove(){
    char[] oArray = new char[TicTacToeArray.length];
    int[][] defensiveOppsArray = new int[TicTacToeArray.length][TicTacToeArray.length];
    int[][] offensiveOppsArray = new int[TicTacToeArray.length][TicTacToeArray.length];
    int[][] sumOppsArray = new int[TicTacToeArray.length][TicTacToeArray.length];
    //converts our Array into a String
    String x = convertTTTArrayToString();

    //Goes through the conditions to see if we have it in memory or if we must go through all the conditions
    boolean matchFound = false;
        for(int i=0; i < memory.size(); i++){
            BoardState element = memory.get(i);
            if(element.str.equals(x)){
                System.out.println("Match Found");
                matchFound = true;
            }}
        if(!matchFound){
        BoardState addme = new BoardState();
        addme.str = x;
        addme.cnt = 1;
        memory.add(addme);

        }

}....


person John Smith    schedule 12.04.2013    source источник
comment
возможный дубликат нестатической переменной не может быть указан из статический контекст   -  person user207421    schedule 12.04.2013


Ответы (2)


Причина, по которой это не работает, заключается в том, что ваш класс BoardState является внутренним, нестатическим классом внутри IntelligentTicTacToe. Это означает, что при ссылке на него вы будете ссылаться на экземпляр класса; экземпляр недоступен из статического контекста.

Одним из решений является объявление этого класса как:

public static class BoardState {

Подробнее о внутренних классах можно прочитать здесь.

person Alex Yarmula    schedule 12.04.2013
comment
работает спасибо! Самое простое решение. Спасибо за объяснение - person John Smith; 12.04.2013

Не вставляйте классы, как вы делаете. В этом нет необходимости, и все, что нужно сделать, это потребовать, чтобы вы создали объект BoardState поверх экземпляра IntelligentTicTacToe, т. е.

BoardState addme = new IntelligentTicTacToe(). new BoardState();

но это не должно быть требованием вашей программы.

Решение: поместите класс BoardState туда, где он должен быть, в его собственном файле. Или сделайте BoardState перечислением, но тогда оно должно содержать только константы.

person Hovercraft Full Of Eels    schedule 12.04.2013
comment
Нет; просто сделай это static. - person SLaks; 12.04.2013
comment
@SLaks: Мог бы и это сделать. Или, лучше, сделайте его перечислением, тогда оно автоматически станет статическим. - person Hovercraft Full Of Eels; 12.04.2013
comment
собираюсь попробовать ваши решения сейчас - person John Smith; 12.04.2013