2013-04-12 116 views
7

錯誤來自此行 BoardState addme = new BoardState();非靜態變量不能從靜態上下文中引用

由於某些原因,它指向的非靜態變量是「新」。我不清楚我如何解決這個錯誤,因爲新的並不是一個變量,而不是。

通過stackoverflow記錄來看,這個錯誤通常來自一個非靜態方法,通常通過靜態方法或完全繞過該方法來解決。 T

下面的代碼是引用這個語句之前和之後發生的事情。

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); 

     } 

} ....

+0

可能重複的[非靜態變量不能從靜態上下文引用](http://stackoverflow.com/questions/2559527/non-static-variable-cannot-be-referenced-from-a-static-上下文) – EJP

回答

17

它不起作用的原因是因爲您的類BoardStateIntelligentTicTacToe內部的非靜態類。這意味着當提到它時,你會引用該類的一個實例;該實例在靜態上下文中不可用。

一種解決方案是聲明類爲:

public static class BoardState { 

你可以閱讀更多的內部類here

+0

作品謝謝!簡單的解決方案。謝謝你的解釋 –

2

不要窩類,比如你在幹什麼。有沒有必要,所有它要做的是要求你在一個IntelligentTicTacToe實例的頂部,即創建一個BoardState對象,

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

,但是這不應該是你的程序的要求。

解決方案:將BoardState類放在它所屬的文件中。 或者讓BoardState成爲一個枚舉,但它應該只保存常量。

+0

否;只是讓它成爲'靜態'。 – SLaks

+0

@SLaks:也可以這樣做。或者更好的是,使它成爲一個枚舉,然後它會自動靜態的。 –

+0

現在試試你的解決方案 –

相關問題