为何Windows PowerShell中java .\HelloWorld报错而java HelloWorld正常?
为什么
java .\HelloWorld报错而java HelloWorld正常? 哈哈,这个坑我刚从Linux转Windows的时候也踩过!其实核心是搞混了javac和java命令的本质要求:
javac是编译器,它认的是文件路径
你用javac .\HelloWorld.java能成功,是因为javac需要明确知道源文件的位置,不管是相对路径还是绝对路径,只要能找到.java文件就行,所以带.\没问题。java是运行命令,它认的是类名,不是文件路径
你的代码里应该定义了public class HelloWorld对吧?这个HelloWorld就是类的全名(因为没加包)。当你运行java HelloWorld时,JVM会在当前目录(默认CLASSPATH包含当前目录)里找HelloWorld.class文件,然后加载这个类的main方法执行。
而你用java .\HelloWorld的时候,JVM会把整个.\\HelloWorld当成类名来处理——它会尝试寻找一个名为.\\HelloWorld的类,但你的类名根本不是这个,自然就会抛出Error: Could not find or load main class .\HelloWorld的错误了。
举个额外的例子:如果你的类在包com.test下,那运行时得写java com.test.HelloWorld,而不是java com\test\HelloWorld,道理是一样的——JVM只认类的全限定名,不认文件系统的路径。
内容的提问来源于stack exchange,提问作者Anirudh Balakka




