Java是';不自动包含类

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());

这似乎是一个简单的问题,但不知何故,我对这段代码有问题。几年后我又回到了Java,我正在制作一个2D游戏。在其中,我有一个名为
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