你好,所以最近我开始从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上。
答案 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