今天遇到一件开心事,在eclipse编写的代码在命令窗口中编译后无法运行,提示 “错误: 找不到或无法加载主类” java中带package和不带package的编译运行方式是不同的。
首先来了解一下package的概念:简单定义为,package是一个为了方便管理组织java文件的目录结构,并防止不同java文件之间发生命名冲突而存在的一个java特性。不同package中的类的名字可以相同,只是在使用时要带上package的名称加以区分
package debug; class Demo {
1、带package运行方法
我的代码目录结构为:D:\WorkSpace-Java\java_excise\src\debug\HelloWorld.java
1 package debug; 2 3 class HelloWorld { 4 public static void main(String[] args){ 5 System.out.println("hi"); 6 } 7 }
在eclipse中运行能正常打印出内容,此时我想在命令窗口中去重新编辑并运行该文件时,即提示错误 找不到或无法加载主类
操作步骤如下:
1、win + R 调出运行窗口并输入 cmd 打开命令窗口
2、切换盘符 输入: e: 然后回车
3、进入到代码目录: cd D:\WorkSpace-Java\java_excise\src\debug
4、编译文件: javac HelloWorld.java
5、运行该文件: java HelloWorld,报错了,如下图:
原因:报这个错原因是在当前目录下,然后根据代码文件中引用的包名会在当前debug目录下再去找debug目录(这个目录肯定不存在,如果你想验证是不是这样,可以手动在当前debug目录下再新建一个debug目录,然后把HelloWorld.class文件拷过去重新运行),所以就会报找不到或者无法加载主类,那么要如何才能正常运行呢,想到了这个代码执行的流程要先找到该debug路径,那是不是我只要返回到当前debug目录的上一级目录,然后重新执行该java文件不就可以找得到debug目录了,话不多说直接上验证截图,从图中可以看到执行成功了:
2、不带package运行方法
1 //package debug; 2 3 class HelloWorld { 4 public static void main(String[] args){ 5 System.out.println("hi"); 6 } 7 }
操作步骤如下:
1、win + R 调出运行窗口并输入 cmd 打开命令窗口
2、切换盘符 输入: e: 然后回车
3、进入到代码目录: cd D:\WorkSpace-Java\java_excise\src\debug
4、编译文件: javac HelloWorld.java
5、运行该文件: java HelloWorld,直接就得出正确的结果了,如下截图:
总结:
1、一般通过IDE开发的代码,在新建class文件时,会默认在文件首行产生一个 package xxx;的代码,这样的代码是可以直接在IDE进行编译并正常运行的(前提是代码无基本的语法错误),如果想要在DOS命令窗口中编译并运行的话,此时就需要将文件目录切换至代码所在目录的上一级目录,然后用 java xxx进行执行,否则会报错,简单做法为:编译文件时javac xxx.java在当前代码路径下,运行文件时需要返回到代码所在目录上一级目录执行,执行时同时要带上包名 java xx.xxx (xx代表包名,xxx代表java类名)。
2、如果是通过Notepad++创建的java文件,一般首行都不会带上package,这样在命令窗口中编译和执行就不需要额外去切换目录了,可以在当前目录直接执行。