无法从命令行运行Swing

8
我在Windows中使用命令行编译并执行Java程序。我访问了http://java.sun.com/docs/books/tutorial/uiswing/start/compile.html,尝试编译HelloWorldSwing.java类,编译成功,但是当我尝试用"java HelloWorldSwing"运行时,它给了我一堆错误,并显示类似于“Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldSwing (wrong name: start/HelloWorldSwing)” 的信息。
我尝试使用“java start/HelloWorldSwing”运行,但它会显示“NoClassDefFoundError”的错误。我使用javac也没有出现任何错误。以下是来自教程的代码:
import javax.swing.*;        

public class HelloWorldSwing {
    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("HelloWorldSwing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Add the ubiquitous "Hello World" label.
        JLabel label = new JLabel("Hello World");
        frame.getContentPane().add(label);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

编辑:使用javaw

窗口弹出

"发生了一个Java异常"

另一个窗口

"错误:找不到主类。 错误:发生了JNI错误,请检查您的安装并重试。"

以前从未遇到过运行任何Java程序的问题,我漏掉了什么吗?有没有办法知道是什么问题?

我也在同一路径下运行命令,其中包括.java和.class文件。

在编译程序的路径中没有“start”文件夹。

编辑2 我尝试了start / HelloWorldSwing和HelloWorldSwing两种方式。

使用javac时我没有任何错误。当我使用javaw时,我会得到两个弹出窗口,其中包含之前输入的消息,并且java会给我NoClassDefFoundException,然后谈论ClassLoader等内容。

编辑3 通过删除“package start;”行,我使它工作了。如果要让它正常工作,我需要做什么?

现在已经删除了包行,javaw也可以工作。


你能否将控制台输出粘贴在你输入“javac etc etc”开始的地方,并继续输入“javac etc.etc”? - OscarRyz
7个回答

4
你从哪里调用java命令?根据你的描述,HelloWorldSwing.class在"start"文件夹中,但不属于任何包。这很可能是错误的源头。请尝试以下操作:
cd start
java HelloWorldSwing

编辑:教程中的代码确实有一个"package start;"声明。你是否将其删除?如果没有,请将HelloWorldSwing放入名为"start"的文件夹中并运行。

java start.HelloWorldSwing

从当前文件夹开始。

另请参阅包教程


如果类包含一个包指令,则不是。 - Luke Woodward
@Pourquoi Litytestdata:发生了什么事情? - Michael Myers
@mmyers:是的,可能错误就在那里,在起始包中。 :) - OscarRyz

3
尝试这个命令:

java HelloWorldSwing

而不是这个命令:

java start/HelloWorldSwing

Java编译器(javac)的参数是一个文件(这就是为什么start/HelloWorldSwing.java可能有效),但Java解释器(java)的参数是一个类名。
这就是为什么在命令行中不需要附加“.class”,并且由于没有名为start/HelloWorldSwing的类,因此会出现“NoClassDefFoundError”错误消息(表示未找到该名称的类定义)。
为了使事情更简单,请从与您的.java文件相同的目录中编译和运行您的第一个程序。

他已经看到问题的第一段了。 - Michael Myers

2

是的。该页面有一个小错误:

这个类使用了一个包,但在运行说明中没有使用这个包。

您可以采取两种方法:

a)删除pacakge start;这一行(即删除包名),按照指示运行

或者

b)保留package start;这一行代码,并在javac后附加-d选项,使用完整的类名。

希望这能帮到您。


这就是为什么你应该使用内置的编辑器功能将图片上传到imgur,而不是自己管理它们。或者更好的方法是完全不使用图片,而是使用代码块代替(就像在发布此答案之前半个小时所做的那样)。:-/ - Synetech
1
7年前我第一次创建这个答案时,内置的编辑器还不存在。 - OscarRyz

1

你可以通过以下方式编译它:

    javac HelloWorldSwing.java

你可以通过以下方式运行它:

    java -cp . HelloWorldSwing.java

这个真的有效。


最好的工作。在我经过多次搜索后,这对我很有帮助。谢谢。 - Zia Khan

1

尝试过这段代码,它可以正常工作。请确保您在与Java文件相同的目录中,并执行以下操作:

javac HelloWorldSwing.java
java HelloWorldSwing

1
你链接的代码与你在问题中包含的代码不同。它在顶部有这一行:
package start;

在Java中,包结构必须与目录结构相对应。因此,如果您的类位于名为“start”的包中,则编译后的类文件必须位于名为“start”的目录中。因此,请确保HelloWorldSwing.class位于“start”目录中,并从父目录运行以下内容:
java start.HelloWorldSwing

0
只需添加一行代码:

import java.awt.*;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接