2013-04-12 17 views
7

このエラーはこの行からのものです BoardState addme = new BoardState();非静的変数これは静的コンテキストから参照することはできません

何らかの理由で、それが指している非静的変数が「新規」です。私はnewが変数ではないので、このエラーをどのように修正できるかは不明ですが、そうではありません。

このエラーは通常、メソッドを静的にするかメソッドを完全にバイパスすることで解決される非静的メソッドから発生します。 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

あなたのクラスBoardStateは、内部の非静的なクラスの内部がIntelligentTicTacToeであるためです。これは、それを参照するときにクラスのインスタンスを参照することを意味します。インスタンスは静的コンテキストからは使用できません。あなたは内部クラスhereの詳細を読むことができます

public static class BoardState { 

一つの解決策は、としてそのクラスを宣言することです。

+0

ありがとう!最も簡単なソリューション。ご説明ありがとうございます –

2

はあなたのようなネストクラスはやってはいけません。そこには必要ませんし、それを行うために起こっているすべては、あなたがIntelligentTicTacToeインスタンスの上にBoardStateオブジェクトを作成することを要求することである、すなわち、

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

が、これはあなたのプログラムの要件ではありません。

解決方法:BoardStateクラスが所属する場所に、それ自身のファイルに配置します。 BoardStateを列挙型にしますが、定数を保持するだけです。

+0

いいえ。ちょうど静的にしてください。 – SLaks

+0

@SLaks:それもできます。または、それをenumにすると、自動的に静的になります。 –

+0

今すぐあなたのソリューションを試してみよう –

関連する問題