【问题标题】:Cannot Find Symbol error when compiling .java file编译 .java 文件时找不到符号错误
【发布时间】:2015-02-25 15:02:17
【问题描述】:

美好的一天, 我在同一个目录中有两个类,Map 和 Field。我成功编译了 Field.java,但是当我编译 Map.java 时,我得到了这个:

  Map.java:4: error: cannot find symbol
    private Field[][] gameMap;
            ^
  symbol:   class Field
  location: class Map
  Map.java:61: error: cannot find symbol
       public Field getFieldPosition(){
              ^
 symbol:   class Field
 location: class Map
 Map.java:8: error: cannot find symbol
                gameMap = new Field[10][20];
                              ^
 symbol:   class Field
 location: class Map
 3 errors

以下是两个类的代码:

public class Map {
private Field[][] gameMap;
private int row, col;
private int rowPlayer, colPlayer;
public Map(){//constructor
    gameMap = new Field[10][20];
    for(row=0;row<10;row++){
        for(col=0;col<20;col++){
            gameMap[row][col].setFieldUntilled();
        }
    }
    rowPlayer = 0;
    colPlayer = 0;
    gameMap[rowPlayer][colPlayer].setPlayerLoc();
}
public Field getFieldPosition(){
    return gameMap[rowPlayer][colPlayer];
}
}

对于 Field.java(如有必要):

public class Field {
private int playerLoc;
private char fieldType;
public Field(){//constructor
    fieldType = 'u';
    playerLoc = 0;
}
public void setFieldUntilled(){
    fieldType = 'u';
}
public void setFieldTilled(){
    fieldType = 't';
}
public void setPlayerLoc(){
    playerLoc = 1;
}
public void removePlayerLoc(){
    playerLoc = 0;
}
public int getPlayerLoc(){
    return playerLoc;
}
}

我分别编译了 Field.java 和 Map.java: javac Field.java 没有返回任何错误,但是 javac Map.java 返回了上面的错误。

【问题讨论】:

  • 你如何编译它们?在命令行上使用 javac Map.java 应该编译这两个文件(因为 Field 是 Map 的依赖项)。
  • @Jaroslaw 是的,我使用 javac Map.java,我得到了 3 个错误
  • 向我们展示您项目的目录/文件布局。还向我们展示您编译时使用的完整命令,并告诉我们您从哪个目录运行它。还有一个问题:您的源文件不包含任何导入语句。你忽略了它们吗?还是没有?
  • @Seelenvirtuose 没有导入语句,因为两个文件都在同一个目录中。
  • @ProgramAllDay 他们也没有包声明?

标签: java class methods compiler-errors


【解决方案1】:

我仍然不清楚您的问题到底出在哪里。但我会告诉你成功的步骤。

提示:我现在描述的内容会有很多替代方案。

我假设您的 MapField 的源文件没有任何包声明和导入语句。

您的项目文件系统中的某处应该有一个单独的项目目录。让我们将该目录命名为my-game。此外,您应该在其中有一个源目录。让我们将其命名为src。您应该将源文件放入该源目录。您的项目目录布局现在如下所示:

my-game/
  |-- src/
       |-- Field.java
       |-- Map.java

如果你想用一个简单的命令编译类Map,你应该在src目录中并调用:

my-game/src> javac Map.java

这将导致两个源文件都被编译。生成的类文件也将被放入该源目录。

到目前为止一切顺利。编译的时候最好在项目目录里面:

my-game> javac src/Map.java

但这现在会导致您描述的编译器错误(并且不会生成任何类文件),因为现在在错误的目录中查找了类 Field。您需要告诉编译器在哪里查找它们:

my-game> javac -sourcepath src src/Map.java

这导致与以前相同的结果。

现在更好的是分离源目录和目标目录。首先在你的项目目录中创建一个名为bin的目录,然后编译:

my-game> javac -sourcepath src -d bin src/Map.java

这将导致以下目录布局:

my-game/
  |-- src/
  |    |-- Field.java
  |    |-- Map.java
  |-- bin/
       |-- Field.class
       |-- Map.class

如果您已成功完成最后一步,请使用 Eclipse 之类的 IDE。它完全有这个项目目录布局,但您不必为编译的确切命令行而烦恼。

【讨论】:

    【解决方案2】:

    几乎毫无疑问,问题在于您设置了 CLASSPATH 环境变量,并且您的值不包括当前目录“.”。这个问题有两种不同的简单修复方法:一种是删除环境变量,但这可能会破坏一些依赖它的第三方软件的安装。解决这个问题的第二种方法是使用 --classpath 参数作为编译行的一部分:

    javac -classpath . Map.java 
    

    【讨论】:

      【解决方案3】:

      您好像忘记在 Map 类中导入 Field。

      【讨论】:

      • 由于两个文件都在同一个目录中,即使不导入也不应该仍然有效吗?
      • @ProgramAllDay 如果两个类都在默认(无名)包中,并且您正在从该目录中编译它们,则应该这样做。我想,后者是你的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 2013-12-06
      • 2013-10-04
      • 2012-08-27
      相关资源
      最近更新 更多