2013-04-12 34 views
7

Lỗi đến từ dòng này BoardState addme = new BoardState();biến không tĩnh này không thể được tham chiếu từ một bối cảnh tĩnh

Vì lý do nào đó, biến không tĩnh mà nó trỏ đến là "mới". Tôi không rõ làm thế nào tôi có thể sửa lỗi này vì mới không có nghĩa là biến, và không phải là.

Nhìn qua các bản ghi lưu lượng ngăn xếp, lỗi này thường xuất phát từ một phương pháp không tĩnh thường được giải quyết bằng cách làm cho phương thức tĩnh hoặc bỏ qua phương thức hoàn toàn. T

Mã dưới đây là để tham khảo những gì đang diễn ra trước và sau tuyên bố này.

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

bản sao có thể có của [biến không tĩnh không thể được tham chiếu từ ngữ cảnh tĩnh] (http://stackoverflow.com/questions/2559527/non-static-variable-cannot-be-referenced-from-a-static- ngữ cảnh) – EJP

Trả lời

17

Lý do không hoạt động là do lớp học của bạn BoardState là lớp bên trong, không tĩnh, bên trong của IntelligentTicTacToe. Điều này có nghĩa là khi đề cập đến nó, bạn sẽ đề cập đến một thể hiện của lớp; cá thể không có sẵn từ ngữ cảnh tĩnh.

Một giải pháp là để khai báo lớp như:

public static class BoardState { 

Bạn có thể đọc thêm về các lớp bên trong here.

+0

hoạt động nhờ! Giải pháp dễ nhất. cám ơn vì đã giải thích –

2

Đừng lớp tổ như bạn đang làm. Không cần, và tất cả nó sẽ làm là yêu cầu bạn tạo một đối tượng BoardState trên đầu trang của một thể hiện IntelligentTicTacToe, ví dụ:

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

nhưng điều này không phải là một yêu cầu của chương trình của bạn.

Giải pháp: Đặt lớp BoardState nơi nó thuộc về, trong tệp riêng của nó. Hoặc làm cho BoardState trở thành một enum, nhưng sau đó nó chỉ nên giữ các hằng số.

+0

Không; chỉ cần làm cho nó 'tĩnh'. – SLaks

+0

@SLaks: Cũng có thể làm điều đó. Hoặc tốt hơn, làm cho nó trở thành một enum, sau đó nó sẽ tự động tĩnh. –

+0

sẽ thử các giải pháp của bạn ngay bây giờ –

Các vấn đề liên quan