【问题标题】:How to solve this cannot find symbol that keeps occurring due to an identifier? [duplicate]如何解决这个找不到由于标识符而不断出现的符号? [复制]
【发布时间】:2019-07-30 21:26:07
【问题描述】:

我正在使用 java 创建这个井字游戏,但是,当我尝试编译程序时,我不断收到来自 Cell 类的 cannot find symbol 错误,我正在努力解决这个问题。

阅读cannot find symbol 错误编译我意识到问题出在Cell 类中的whoseTurn 变量上。我研究了为什么会出现 cannot find symbol 并发现这主要是由于标识符:

  • 拼写错误。
  • 调用标识符时使用了错误的大小写。
  • 使用在另一个类中声明的变量,但隐式告诉编译器查找错误的类、作用域或包。

但是whoseTurn 变量在Cell 类中没有拼写错误,我在调用标识符时也没有遇到任何错误。但是,我能看到的唯一可行的问题是变量whoseTurn 超出范围,或者我隐式告诉编译器查找错误的类。

该类控制游戏的所有基本控件:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

public class Cell extends JPanel {
   public char token = ' ';

public Cell () {
    setBorder (new LineBorder (Color.black, 1));
    addMouseListener (new MouseListener ());
}//CLOSE CONSTRUCTOR

//GETTOKEN METHOD
public char getToken () {
    return token;
}//CLOSE GETTOKEN METHOD

//SETTOKEN METHOD
public void setToken (char c) {
    token = c;
    repaint ();
}//CLOSE SETTOKEN METHOD

//PAINTCOMPONENT METHOD
protected void paintComponent (Graphics g) {//WHEN THE setTOKEN () CALLS REPAINT()
    super.paintComponent (g);

    if (token == 'x') {//IF STATEMENT
       g.drawLine (10, 10, getWidth () - 10, getHeight() - 10);
       g.drawLine (getWidth () - 10, 10, 10, getHeight() - 10);
    }//CLOSE IF STATEMENT

    else if (token == 'o') {//ELSE STATEMENT 
        g.drawOval (10, 10, getWidth() - 20, getHeight() - 20);
    }//CLOSE ELSE STATEMENT
}//CLOSE PAINTCOMPONENT METHOD

//INNER CLASS
private class MouseListener extends MouseAdapter {//WHAT HAPPENS WHEN THE PLAYER CLICKS ON ANY OF THE COLUMNS     
   public void mouseClicked (MouseEvent e) {
       if (token == ' ' && whoseTurn != ' ') {//THIS IS THE FIRST CANNOT FIND SYMBOL ERROR THAT OCCURS
          setToken (whoseTurn);
       }//CLOSE IF STATEMENT

       if (isWon (whoseTurn)) {
           jlblStatus.setText (whoseTurn + " won! Gameover!");
           whoseTurn = ' ';
       }//CLOSE IF STATEMENT

       else if (isFull ()) {
           jlblStatus.setText ("Tie game! Game over!");
           whoseTurn = ' ';
       }//CLOSE ELSE IF STATEMENT

       else {
          whoseTurn = (whoseTurn == 'X') ? '0' : 'X';
          jlblStatus.setText (whoseTurn + "'s turn.");
       }//CLOSE ELSE STATEMENT
   }//CLOSE MOUSECLICKED METHOD
}//CLOSE INNER CLASS
}//CLOSE CELL CLASS

这个类构建了带有行和列的网格供用户点击,并检查用户是否制作了图案或填充了网格:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;

public class TicTacToeFrame extends JFrame {
   public char whoseTurn = 'x';   // THIS IS THE INSTANCE VARIABLE WHICH IS CAUSING THE CANNOT FIND SYMBOL ERROR

   public Cell [] [] cells = new Cell [3] [3];

   JLabel jlblStatus = new JLabel ("X's turn to play");

   public TicTacToeFrame () {
   JPanel panel = new JPanel (new GridLayout (3, 3, 0, 0));
   for (int i = 0; i < 3; i++) {
     for (int j = 0; j < 3; j++) {
        panel.add (cells [i] [j] = new Cell());
     }//CLOSE NESTED FOR LOOP
   }//CLOSE FOR LOOP

   panel.setBorder (new LineBorder (Color.red, 1));
   jlblStatus.setBorder (new LineBorder (Color.yellow, 1));

   add (panel, BorderLayout.CENTER);
   add (jlblStatus, BorderLayout.SOUTH);
}//CLOSE CONSTRUCTOR

//ISFULL METHOD
public boolean isFull () {//CHECKS WHETHER ALL THE ROWS AND COLUMNS ARE FULL
    for (int i = 0; i < 3; i++) {
       for (int j = 0; j < 3; j++) {
          if (cells [i] [j].getToken () == ' ') {
             return false;
          }//CLOSE IF STATEMENT
       }//CLOSE NESTED FOR LOOP
    }//CLOSE FOR LOOP
     return true;
}//CLOSE ISFULL METHOD

//ISWON METHOD
public boolean isWon (char token) {//THIS METHOD CHECKS WHETHER THE PLAYER HAS MADE A PATTERN IN A ROW OR COLUMN OR RIGHT DIAGONALLY OR LEFT DIAGONALLY
    for (int i = 0; i < 3; i++) {
      if ((cells [i] [0].getToken () == token) && (cells [i] [1].getToken () == token) && (cells [i] [2].getToken () == token)) {
          return true;
      }//CLOSE IF STATEMENT
    }//CLOSE FOR LOOP

    for (int j = 0; j < 3; j++) {
      if ((cells [0] [j].getToken () == token) && (cells [1] [j].getToken () == token) && (cells [2] [j].getToken () == token)) {
         return true;
      }//CLOSE IF STATEMENT
    }//CLOSE FOR LOOP

    if ((cells [0] [0].getToken() == token) && (cells [1] [1].getToken () == token) && (cells [2] [2].getToken () == token)) {
      return true;
    }//CLOSE IF STATEMENT

    if ((cells [0] [2].getToken() == token) && (cells [1] [1].getToken () == token) && (cells [2] [0].getToken () == token)) {
      return true;
    }//CLOSE IF STATEMENT

    return false;
}//CLOSE ISWON METHOD
}//CLOSE TICTACFRAME CLASS

这是主类:

import javax.swing.JFrame;

public class TicTacToeMain {   
  public static void main (String [] args) {
      JFrame TicTacToe = new TicTacToeFrame ();
      TicTacToe.setTitle ("TicTacToe Game!");
      TicTacToe.setSize (600, 600);//SET THE SIZE FOR THE JFRAME
      TicTacToe.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
      TicTacToe.setLocationRelativeTo (null);
      TicTacToe.setVisible (true);
 }//CLOSES MAIN METHOD
}//CLOSES TIC TAC TOE MAIN CLASS

这是我在编译时不断遇到的错误:

Cell.java:43:错误:找不到符号
if (token == ' ' && whoTurn != ' ') { ^
符号:变量whichTurn
位置:类 Cell.MouseListener

Cell.java:44:错误:找不到符号
setToken (whoseTurn);
^
符号:变量whichTurn
位置:类 Cell.MouseListener

Cell.java:47:错误:找不到符号
if (isWon (whoseTurn)) {
^
符号:变量whichTurn
位置:类 Cell.MouseListener

Cell.java:48:错误:找不到符号
jlblStatus.setText (whoseTurn + "赢了!Gameover!");
^
符号:变量whichTurn
位置:类 Cell.MouseListener

Cell.java:48:错误:找不到符号
jlblStatus.setText (whoseTurn + "赢了!Gameover!");
^ 符号:变量 jlblStatus
位置:类 Cell.MouseListener

Cell.java:49:错误:找不到符号
谁的转 = ' '; ^
符号:变量whichTurn
位置:类 Cell.MouseListener

Cell.java:52:错误:找不到符号
否则 if (isFull ()) {
^
符号:方法 isFull()
位置:类 Cell.MouseListener

Cell.java:53:错误:找不到符号
jlblStatus.setText ("平局!游戏结束!");
^
符号:变量 jlblStatus
位置:类 Cell.MouseListener

Cell.java:54:错误:找不到符号
whoTurn = ' ';
^
符号:变量whichTurn
位置:类 Cell.MouseListener

Cell.java:58:错误:找不到符号
whoTurn = (whoseTurn == 'X') ? “0”:“X”; ^
符号:变量whichTurn
位置:类 Cell.MouseListener

Cell.java:58:错误:找不到符号
whoTurn = (whoseTurn == 'X') ? '0' : 'X';
^
符号:变量whichTurn
位置:类 Cell.MouseListener

有人可以帮我解决标识符whoseTurn 的“找不到符号”错误吗?

花时间阅读这篇文章。

【问题讨论】:

  • 无关:这样的 cmets if (token == 'x') {//IF STATEMENT 是浪费时间和精力。这非常简单:您不需要嵌套块,因此您需要 cmets 来识别块的结束位置。相反:您正确缩进所有块,并且您也有短块,理想情况下没有任何嵌套。然后你可以省略那些除了分散读者之外什么都不做的大写cmets。

标签: java tic-tac-toe cannot-find-symbol


【解决方案1】:

这是我的第一篇文章,祝我好运。

看起来whoseTurn 是在TicTacToeFrame 类中声明的,但您是从Cell.MouseListener 调用它。

您需要在 TicTacToeFrame 类中创建一个方法,您可以从 Cell 类调用该方法以确定 whoseTurn 值。

另外,(次要问题,但注意到了)看起来您将 whoseTurn 声明为小写 x,但随后检查它是否为大写 X。

希望这会有所帮助。

【讨论】:

  • 我没有使用这种方法来解决找不到符号,但感谢您向我提出这个想法。
【解决方案2】:

您没有在Cell 的任何地方定义whoseTurn。您的代码要求一个从未提供过的值。您需要在Cell 中定义它,或者在调用方法时将其传入。

我会将您的 TickTackToe 板的实例作为单例,并在鼠标单击中调用其方法之一。这样一来,您的 TickTackToe 棋盘就是唯一关心轮到谁的对象了。

如果您想避免使用单例,也可以在Cell 的构造函数中传递对this 的引用。

另外,为什么使用//SOMEMETHOD METHOD//CLOSE SOMEMETHOD METHOD?我建议不要这样做。注释应该提供有关您为什么或如何做某事的有用信息,而不是您正在打开或关闭范围。

希望对你有帮助

【讨论】:

  • 感谢您的帮助。我没有在 TicTacToeFrame 类中定义 whosTurn,而是在 Cell 类中定义了它。这帮助我解决了 whoTurn 变量上找不到符号的问题。
  • 请不要在每个单元格中定义轮到谁。它只需要被一个对象知道。当一个单元格的whoseTurn 值与另一个单元格不同时会发生什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多