在使用命令行进行java程序的编译和运行时,报“ 找不到或没法加载主类”的错误。html
首先,在ide中是能够正常编译和运行的。查找了部分的解决方案,不少人提供的思路是环境变量设置有误,但检查java
环境变量等均无问题,在参阅了文章:ide
http://www.cnblogs.com/wangxiaoha/p/6293340.htmlthis
以后,发现产生错误的缘由是对package,类路径以及java编译器及虚拟机查找文件的模式不理解,以致命令行输入混乱。进而查阅书籍,在《Java核心技术卷1》中对Windows系统下使用命令行运行java程序,类路径以及包之间的关系有较为详细的阐述,整体来讲有一下几点须要注意。spa
1.编译器在编译源文件的时候不检查目录结构。可是若是包和目录不匹配,虚拟机就找不到类。命令行
因此在出现问题后,发现编译总能经过,可是运行时会报错。3d
2.编译器对文件进行操做,而java解释器加载类code
eg:javac com/mycompany/PayrollApp.javahtm
java com.mycompany.PayrollAppblog
Oracle官方也提出了初学者易犯的错误就包括使用java xx.class的形式运行程序
A common mistake made by beginner programmers is to try and run the java
launcher on the .class
file that was created by the compiler. For example, you'll get this error if you try to run your program with java HelloWorldApp.class
instead of java HelloWorldApp
. Remember, the argument is the name of the class that you want to use, not the filename.
3.javac编译器老是在当前目录查找文件,可是Java虚拟机尽在类路径中有"."目录的时候才看当前目录。若是没有设置类路径也不会有什么问题,默认的类路径包含"."目录,然而设置了类路径却忘记包含"."目录,程序任可经过编译可是没法运行。
第三条是致使今天发现的错误的直接缘由
当咱们没有在程序中定义package的时候,直接在文件目录下进行编译和运行并不会出现问题
当咱们加上package后
咱们能够经过编译可是没法运行,这就是类路径与目录不匹配形成。
按照第三条中的描述,添加了"."的包,让解释器在demo目录下搜索文件,问题解决。