Java 命令运行 class 文件,报“找不到或无法加载主类”错误

在使用命令行进行java程序的编译和运行时,报“ 找不到或无法加载主类”的错误。

首先,在ide中是可以正常编译和运行的。查找了部分的解决方案,很多人提供的思路是环境变量设置有误,但检查

环境变量等均无问题,在参阅了文章:

http://www.cnblogs.com/wangxiaoha/p/6293340.html

之后,发现产生错误的原因是对package,类路径以及java编译器及虚拟机查找文件的模式不理解,以至命令行输入混乱。进而查阅书籍,在《Java核心技术卷1》中对Windows系统下使用命令行运行java程序,类路径以及包之间的关系有较为详细的阐述,总体来说有一下几点需要注意。

1.编译器在编译源文件的时候不检查目录结构。但是如果包和目录不匹配,虚拟机就找不到类。

所以在出现问题后,发现编译总能通过,但是运行时会报错。

2.编译器对文件进行操作,而java解释器加载类

eg:javac com/mycompany/PayrollApp.java

  java com.mycompany.PayrollApp

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目录下搜索文件,问题解决。

 

转自:https://www.cnblogs.com/wangxiaoha/p/6293340.html

其实原因很简单,我们忽略了2个细节。

1.java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定的目录中寻找的。

2.我们忽略了package的影响。

第一个问题好解决:

我们直接在CLASSPATH环境变量中加入“.;”即可。“.”的意思是搜索当前目录

第二个问题看下面分析:

看下面两个类

类A和类B的唯一差别就是没有定义包名。

我们的工程路径是D:\HelloWorld,在HelloWorld文件夹中建立一个src文件夹,类B的源代码文件就放在src中。用javac编译完以后

会在src文件夹中生成NewsManager.class,如下

为什么加入了package后就不对了呢?

类A中package的路径是org.will.app.main。按照java规定,我们应该按照package定义的路径来存放源文件,类A应该放入:

src\org\will\app\main下,如下:

成功!

总结:

一、java执行class文件是根据CLASSPATH指定的地方来找,不是我们理解当前目录。如果希望它查询当前目录,需要在CLASSPATH中加入“.;”,代表当前目录。

二、java执行class文件对package的路径是强依赖的。它在执行的时候会严格以当前用户路径为基础,按照package指定的包路径转化为文件路径去搜索class文件。各位同学以后注意就OK啦。至于网上说的要在CLASSPATH要加各种包等等都是泛泛而谈,真正静下心分析这个问题的资料不多。很多都没有说到点子上,会误导人的。

当使用Java命令运行.class文件时,如果提示不到无法加载主类错误,通常是由于以下几个原因所导致: 1. 错误命令格式:可能是因为在运行程序时使用了错误命令格式。正确的格式应该是使用java命令后跟着类的名称,而不是类文件的名称。例如,应该使用"java HelloWorldApp"而不是"java HelloWorldApp.class"。 2. 包名和类路径的问题:如果你的程序中使用了包名(package),那么在运行时需要注意类的路径。正确的类路径应该是包名+类名。比如,如果你的类的完整名称是"com.woniuxy.leassion4.Test",那么你应该在命令行中使用"java com.woniuxy.leassion4.Test"来运行程序。 3. 编译器和虚拟机的查模式:Java编译器和虚拟机会按照一定的规则查文件。因此,如果你在命令行中运行Java程序时,需要确保类文件位于编译器和虚拟机指定的查路径中。通常,编译器默认会在当前工作目录下查文件,而虚拟机则会在类路径指定的位置查文件。如果类文件没有被正确地放置在对应的位置,就会导致不到无法加载主类错误。 综上所述,当在Java命令运行.class文件时出现不到无法加载主类错误,你可以检查命令格式、包名和类路径,以及类文件的位置是否正确。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java命令运行class文件不到无法加载主类错误](https://blog.csdn.net/weixin_30576827/article/details/95401134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Java命令运行.class文件,提示错误不到无法加载主类问题](https://blog.csdn.net/y7788c/article/details/82319572)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值