non-static variable this cannot be referenced from a static context
Solution 1
The reason it doesn't work is because your class BoardState
is an inner, non-static, class inside of IntelligentTicTacToe
. This means that when referring to it, you'll be referring to an instance of the class; the instance isn't available from a static context.
One solution is to declare that class as:
public static class BoardState {
You can read more on inner classes here.
Solution 2
Don't nest classes like you're doing. There's no need, and all it's going to do is to require that you create a BoardState object on top of an IntelligentTicTacToe instance, i.e.,
BoardState addme = new IntelligentTicTacToe(). new BoardState();
but this should not be a requirement of your program.
Solution: Put the BoardState class where it belongs, in its own file. Or make BoardState an enum, but then it should only hold constants.
Admin
Updated on April 12, 2020Comments
-
Admin about 4 years
The error comes from this line BoardState addme = new BoardState();
For some reason the non-static variable that it is pointing at is "new". I am unclear of how I can fix this error as new is not meant to be a variable, and is not.
Looking through the stackoverflow records this error usually comes from a non-static method which is usually solved by making the method static or bypassing the method entirely. T
This code below is to reference what is going on before and after this statement.
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); }
}....
-
SLaks about 11 yearsNo; just make it
static
. -
Hovercraft Full Of Eels about 11 years@SLaks: Could do that too. Or better, make it an enum, then it's automatically static.
-
Admin about 11 yearsgoing to try your solutions now
-
Admin about 11 yearsworks thanks! Easiest solution. Thank you for the explanation