Java是';不自动包含类
这似乎是一个简单的问题,但不知何故,我对这段代码有问题。几年后我又回到了Java,我正在制作一个2D游戏。在其中,我有一个名为Java是';不自动包含类,java,Java,这似乎是一个简单的问题,但不知何故,我对这段代码有问题。几年后我又回到了Java,我正在制作一个2D游戏。在其中,我有一个名为SnakeGame的主驱动程序类,它加载类GameBoard的一个新实例 SnakeGame.java package snake2; import javax.swing.JFrame; public class SnakeGame extends JFrame { public SnakeGame() { add(new GameBoard());
SnakeGame
的主驱动程序类,它加载类GameBoard
的一个新实例
SnakeGame.java
package snake2;
import javax.swing.JFrame;
public class SnakeGame extends JFrame {
public SnakeGame() {
add(new GameBoard());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(320, 340);
setLocationRelativeTo(null);
setTitle("Snake Game");
setResizable(false);
setVisible(true);
}
public static void main(String[] args) {
new SnakeGame();
}
}
同一目录中有GameBoard.java,它有一个构造函数,没有必需的参数:
public GameBoard() {
[... more code ...]
}
编辑
GameBoard.java
和SnakeGame.java
都有package snake2代码>位于其文件的第一行
但是,我一直收到以下错误:
SnakeGame.java:7: cannot find symbol
symbol : class GameBoard
location: class snake2.SnakeGame
add(new GameBoard());
^
1 error
编辑#2
我尝试使用java-cp将其添加到我的类路径中。游戏板在javac
之后。以下是终端的第一行可怕且不必要的冗长响应:
Exception in thread "main" java.lang.NoClassDefFoundError: GameBoard (wrong name: snake2/GameBoard)
这就好像我拼错了类,或者拼错了文件名。虽然,据我所知,我也没有这样做。我的代码还有其他一些我没有注意到的问题吗
提前感谢您的帮助。除了在同一个目录中之外,您在GameBoard.java中是否有包
语句
编辑以运行程序--
@斯蒂芬:我在运行java,所有的文件都在同一个目录下
来自@kbolino
您必须将源文件放在snake2目录中,并从父目录[…]运行javac
您还必须使用正确的包和类路径调用java,而不仅仅是javac
创建SnakeGame和GameBoard存根后,对我有用的示例:
当前目录是projects
,它是snake2
目录的父目录,其中文件是:
JavaSnake2.SnakeGame
当前目录是我编辑文件的snake2
:
java-cp。。蛇2.蛇游戏
对于案例2,由于您在包目录中,因此必须将父目录放在类路径中
在javac
compile命令和java
run命令中添加了大量显示会话的信息。您不需要像某些人建议的那样使用-cp
进行编译
包装
将应用程序打包到一个.jar
文件中,并附带一个指定要运行的主类的清单,然后只需使用
java -jar myprogram.jar
为此,在包目录上方的目录中创建一个文件Manifest.txt
[~/tests/java/snake2]$ cd ..
[~/tests/java]$ ls -1F
Manifest.txt
snake2/
[~/tests/java]$ cat Manifest.txt
Main-Class: snake2.SnakeGame
[~/tests/java]$ jar cfm myprogram.jar Manifest.txt snake2/*.class
[~/tests/java]$ jar tf myprogram.jar
META-INF/
META-INF/MANIFEST.MF
snake2/GameBoard.class
snake2/SnakeGame.class
您还可以围绕它包装一个脚本(shell脚本、批处理文件等),这样您只需运行myprogram
,它就可以运行java-jarmyprogram.jar
这将是构建过程的一部分。检查类路径。通常当我遇到这样的问题时,这是一个类路径问题。我知道你的情况并不复杂,但还是要检查一下
此外,如果您正在使用eclipse,请尝试清理您的工作区。有时候,像这样的怪癖是通过这种方式解决的 我能想到的唯一问题是GameBoard
中的包的定义不正确。或者,您是否尝试过清理并重新编译所有内容?可能性:
- 非打印字符和/或特殊字符潜入其中一个文件中,使
游戏板
标识符不同,即使它们看起来相同
- 您的一个或多个文件存在字符编码问题,这会使编译器出错
GameBoard
不继承自java.awt.Component
,这是add()
工作所必需的
- 您省略了
类游戏板前面的public
修饰符
- 您省略了GameBoard.java顶部的
package snake2
语句
列出了“找不到符号”错误的一些常见原因,尽管它可能无法解释您的特定错误
编辑:
克博利诺可能有什么想法,尽管他的回答在语法上是不正确的。我在我的机器上做了一个模型,下面是我的作品:
(any parent directories)
|
|--snake2
|
|--SnakeGame.java
|--GameBoard.java
然后从snake2
目录中运行
javac SnakeGame.java GameBoard.java
然后返回到snake2的父目录并运行
java snake2/SnakeGame
编辑2
在评论中,OP询问“为什么JavaSnakeGame
在snake2文件夹中不起作用,而JavaSnake2/SnakeGame
在父目录中起作用?”
这个问题是善意的,但有误导性<该命令中的code>snake2
是名称的一部分,而不是路径。如果在snake2
文件夹中,java-cp。。蛇2/蛇游戏
仍然有效。出于类似的原因,javac-cp snake2 snake2/SnakeGame.java snake2/GameBoard.java
在snake2
的父目录下也可以工作
也就是说,javasnake2/SnakeGame
单独(仍然在snake2
文件夹中)不起作用。这是因为
请记住,在使用类路径时,路径中的最后一个目录必须是包的根目录的超级目录。(SCJP 6指南,Sierra&Bates,第804页)
我真的不知道这是不是你的问题。但是在JAVA的API中,如果搜索JFrame,描述中会这样说:
JFrame类与Frame稍微不兼容。与所有其他JFC/Swing顶级容器一样,JFrame包含一个JRootPane作为其唯一的子容器。根窗格提供的内容窗格通常应包含JFrame显示的所有非菜单组件。这与AWT机架的情况不同。例如,要将子对象添加到AWT框架中,请编写:
但是,使用JFrame时,您需要将子项添加到JFrame的内容窗格:
你能试试吗?有趣的是,有经验的Java有这么一个小问题
java snake2/SnakeGame
frame.add(child);
frame.getContentPane().add(child);
javac -cp . SnakeGame
GameBoard gameBoard = new GameBoard();
System.out.println(gameBoard);
add(gameBoard );
javac *.java
javac snake2/*.java