编译 .java 文件时出现 Cannot Find Symbol 错误
Cannot Find Symbol error when compiling .java file
美好的一天,
我在同一个目录中有两个 类、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 没有 return 任何错误,但 javac Map.java return 编辑了上面的错误。
您似乎忘记在地图中导入 Field class。
我还不清楚你的问题到底出在哪里。但我会告诉你成功的步骤。
提示:除了我现在描述的内容,还有很多选择。
我假设您的 Map
和 Field
的源文件没有任何包声明和导入语句。
您的项目应该在文件系统的某处有一个单独的项目目录。让我们将该目录命名为 my-game
。此外,您应该在其中有一个源目录。我们将其命名为 src
。您应该将源文件放入该源目录中。您的项目目录布局现在如下所示:
my-game/
|-- src/
|-- Field.java
|-- Map.java
如果你想用一个简单的命令编译class Map
,你应该在src
目录中并调用:
my-game/src> javac Map.java
这将导致编译两个源文件。生成的 class 个文件也将放入该源目录。
到目前为止一切顺利。编译的时候最好在项目目录里面:
my-game> javac src/Map.java
但这现在会导致您描述的编译器错误(并且不会生成 class 文件),因为现在 class 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。它具有完全相同的项目目录布局,但您不必为编译的确切命令行而烦恼。
几乎毫无疑问,问题是您设置了 CLASSPATH 环境变量,并且您的值不包括“.”,即当前目录。这个问题有两种不同的简单修复方法:一种是删除环境变量,但这可能会破坏某些依赖于它的第三方软件的安装。解决此问题的第二种方法是将 –classpath 参数用作编译行的一部分:
javac -classpath . Map.java
美好的一天, 我在同一个目录中有两个 类、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 没有 return 任何错误,但 javac Map.java return 编辑了上面的错误。
您似乎忘记在地图中导入 Field class。
我还不清楚你的问题到底出在哪里。但我会告诉你成功的步骤。
提示:除了我现在描述的内容,还有很多选择。
我假设您的 Map
和 Field
的源文件没有任何包声明和导入语句。
您的项目应该在文件系统的某处有一个单独的项目目录。让我们将该目录命名为 my-game
。此外,您应该在其中有一个源目录。我们将其命名为 src
。您应该将源文件放入该源目录中。您的项目目录布局现在如下所示:
my-game/
|-- src/
|-- Field.java
|-- Map.java
如果你想用一个简单的命令编译class Map
,你应该在src
目录中并调用:
my-game/src> javac Map.java
这将导致编译两个源文件。生成的 class 个文件也将放入该源目录。
到目前为止一切顺利。编译的时候最好在项目目录里面:
my-game> javac src/Map.java
但这现在会导致您描述的编译器错误(并且不会生成 class 文件),因为现在 class 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。它具有完全相同的项目目录布局,但您不必为编译的确切命令行而烦恼。
几乎毫无疑问,问题是您设置了 CLASSPATH 环境变量,并且您的值不包括“.”,即当前目录。这个问题有两种不同的简单修复方法:一种是删除环境变量,但这可能会破坏某些依赖于它的第三方软件的安装。解决此问题的第二种方法是将 –classpath 参数用作编译行的一部分:
javac -classpath . Map.java