2012-01-24 60 views
1

我正在关注Princeton website上的java教程。Java不会在终端java.lang.NoClassDefFoundError中运行程序

我跑debian sqeeze 64bit,我已经安装了Sun的Java版本6.

我可以编译,没有任何问题,运行基本hello world程序,使用终端和Eclipse IDE。

的问题是:

,当我尝试编译并运行程序,这需要例如参数输入:

public class RandomSeq { 
    public static void main(String[] args) { 

     // command-line argument 
     int N = Integer.parseInt(args[0]); 

     // generate and print N numbers between 0 and 1 
     for (int i = 0; i < N; i++) { 
      System.out.println(Math.random()); 
     } 
    } 
} 

我可以在Eclipse中运行这个把一个整数参数,但它在终端上不起作用。

我得到这个错误:

[email protected]:~/Documents/workspace/IOput/src/randomSeq$ java RandomSeq 21 Exception in thread "main" java.lang.NoClassDefFoundError: RandomSeq (wrong name: randomSeq/RandomSeq) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) at java.lang.ClassLoader.defineClass(ClassLoader.java:615) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) Could not find the main class: RandomSeq. Program will exit.

我试图更新/etc/profile包括在PATH变量java-6-sun

我不确定,从这里尝试。

+0

您的类路径不正确。 –

+0

你的主要课程是在默认包中吗?你是否把它包含在另一个包中?如果是这样,请不要将其保留在默认包中。 – Adrian

+0

你的源文件中有包定义吗?如果是,转到'src /'文件夹并在那里执行程序(使用'randomseq.Randomseq'作为类) – ZeissS

回答

2

显然,您正尝试从Eclipse项目的src文件夹运行程序。 src代表“来源”。程序的可执行版本(编译后的类)不在src;它在bin,代表“二进制”,即机器代码。

当使用命令行,你应该先编译程序:

javac MyClass.java 

,然后运行它:

java MyClass 

但是,请不要做一个Eclipse项目的目录结构中,或者您将创建额外的文件(类文件),Eclipse在此位置不是预期的。


此外,也许你是在一个包内。如果您位于其包文件夹中,则无法运行该类。您需要位于程序包层次结构的顶层。

例子:假设你的类是一个名为mypackage包内。然后在someFolder/mypackage/MyClass.java你会碰到这样的:

package mypackage; 

class MyClass { 
    ... 
} 

编译代码后,你必须在somefolder并发出shell命令:

java mypackage.MyClass 
1

看起来好像你的类有一个包

package randomSeq; 

public class RandomSeq { 

如果是这样,那么在启动时它应该位于文件夹randomSeq和根该文件夹应该在您的类路径中,并且调用时必须指定该包。

所以,如果你的.class文件是在斌/ randomSeq,那么你可以用java命令斌运行randomSeq.RandomSeq 21

0

别为我担心的说法,因为这将给予一个运行时间空指针异常。
问题是你的类路径。

在运行java RandomSeq的目录中创建一个列表(ls或dir)。 那里有.class file。如果不运行javac RandomSeq.java首先生成类文件