java能够编译,但无法用cmd找到类错误

时间:2018-04-05 10:51:30

标签: java

你好,所以最近我开始从c ++转移到java,一个练习就是用cmd编译和运行一个java程序。

好吧,我使用netbeans编写了我的简单HelloWorld程序并保存了它,

package helloworld;      
public class Helloworld 
{


   public static void main(String[] args) 
   {
        System.out.println("Hello world");
   } 

}      

所以现在我保存的.java文件位于C:\ Users \ eatmybuns \ Documents \ NetBeansProjects \ Helloworld \ src \ helloworld

现在我打开cmd并将目录更改为上面的内容并输入 javac Helloworld.java 现在我可以在同一个文件夹中看到Helloworld.class,我从某处读到我必须包含包名以及它运行所以我输入

java helloworld.Helloworld

它给了我一个错误,所以我尝试从src文件夹运行它,但它也给了我同样的错误。

错误:无法找到或加载主类Helloworld

引起:java.lang.ClassNotFoundException:Helloworld

我已经阅读了一些可能的解决方案,例如使用-cp或使用-d但它一直给我同样的错误。我目前正在使用jdk1.8.0_161。在Windows 10上。

2 个答案:

答案 0 :(得分:2)

你必须使用

java helloworld.Helloworld      

来自helloworld的父文件夹,在你的情况下是src目录。

包和目录结构之间存在紧密关系。

您可以为编译器设置许多标志,例如srcdir,targetdir以保持类和源分开。但基本上,当你调用你的类helloworld.Helloworld时,JVM会查找一个目录helloworld /并期望在那里有一个Helloworld.class。

要在没有编译器标志的情况下实现此目的,您必须将源代码放入helloworld /文件夹中。

你的班级的全名是helloworld.Helloworld,java应该在那里找到并找到它。

mkdir helloworld
mv Helloworld.java  helloworld/
javac helloworld/Helloworld.java 
java helloworld.Helloworld 
Hello world

一开始有点令人惊讶,如果你不知道它,并开始没有包声明的类。但逻辑简单直接:每个包都反映在目录结构中。

由于sourcedir和targetdir的区别,下面的目录结构必须与不相同,只是起点不同。常见的目标目标是类或bin,如:

javac -s . helloworld/Helloworld.java -d classes

javac -s ./src helloworld/Helloworld.java -d bin

但是bin或类不会获取包名称的一部分,并且您不能通过将该dir添加到调用路径来扩展类的调用:

java bin.helloworld.Helloworld

不起作用。但

java -cp ./bin helloworld.Helloworld

应。如果您仔细阅读文档,您会发现,它会仔细区分源文件(Helloworld.java),类(Helloworld)和文件(Helloworld.class)。

答案 1 :(得分:1)

编译   javac helloworld.Helloworld.java

成功编译之后运行以获得输出

java Helloworld