java编译通过,为什么运行却提示找不到或无法加载主类

首先,让我们简单了解一下怎样使用java命令来运行java程序的正确方法。

语法是这样的:

java [<options>] <class-name> [<arg> …]

其中<option>是命令行选项(以“-”字符开头),<class-name>是Java类完整名称(FQN),包括类所在的包,比如说packagename.packagename2.ClassName,或者packagename/packagename2/ClassName,而<arg>是传递给应用程序的命令行参数。举个例子:

java -Xmx100m com.hello.world.HelloWorld arg1 arg2

上面这个命令会执行以下操作:

  1. 搜索com.hello.world.HelloWorld类的字节码
  2. 加载类
  3. 判断类是否包含主方法入口
  4. 调用主方法入口,并把参数arg1和arg2传递给它

当出现“找不到或无法加载主类…”的情况时,表明第一步已失败,Java命令无法找到类。并且在错误消息中会给出正在寻找的类名。

下面说一说为什么会出现找不或者无法加载类的原因:

1 类名错误

第一个可能的原因是类名错误,或者正确的类名,但格式错误。

类名需要保证:拼写正确(包括大小写),并且完整(包名要包括在内)。

2 类路径错误

2.1 类路径设置错误

类路径(CLASSPATH)是Java运行时环境搜索类和其它资源文件的路径。

类路径的设置的完整解释可以去看一下Oracle文档,这里给出一个简单的说明。

windows下类路径的设置命令:

set CLASSPATH=classpath1;classpath2…

Linux下类路径的设置命令:

export CLASSPATH=”classpath1:classpath2…”

注意,windows和linux使用的分隔符不同,windows是“;”,linux是“:”.

也可以在运行时使用-cp选项来指定类路径:

java -cp classpath <class-name> [<arg> …]

设置类路径时,它应该对应于类完整名称的根目录。

2.2 子目录和类完整名(FQN)不匹配

比如,如果类的完整名称是com.hello.world.HelloWorld,那么JVM查找时,会在子目录“com/hello/world”中找名为HelloWorld的类。如果子目录与包命名不匹配,也会导致JVM将找不到类。

如果编译后曾经移动过类或者重命名了类,也会导致命令运行失败,但是导致的错误将会是java.lang.NoClassDefFoundError,并不是找不到或者无法加载类。

给个完整的例子

想运行com.hello.world.HelloWorld类,

完整的文件路径是/java/coding/com/hello/world/HelloWorld.class,

当前的工作目录是/java/coding/,

那么运行:

java com.hello.world.HelloWorld

如果当前工作目录是/java/coding/com/hello/world/,

那么需要指定类路径(类路径可以是相对路径也可以是完全路径):

java -cp ../../../ com.hello.world.HelloWorld

3 类路径中缺少类的依赖dependencies

类路径需要包括所有程序依赖的其它(非系统)的类。系统类是自动定位的,但需要确保非系统类在类路径当中,方法如上所示。

希望这个解答可以帮到你。

本文来自投稿,不代表天一生活立场,如若转载,请注明出处:http://tiyigo.com/it/5811.html

(0)
上一篇 2022-12-17 09:56
下一篇 2022-12-17 10:10

相关推荐