java 找不到或无法加载主类

java 找不到或无法加载主类

很多Java新手在使用命令行编译.java文件正常,然后运行时会遇到“错误: 找不到或无法加载主类”的错误提示。可是程序代码一点问题都没有,用IDE跑也正确,为什么CMD就不行呢。

这多半其实是java命令语法使用时的错误,或者是系统环境变量中缺少.;,点代表当前文件夹,即在当前文件夹中查找该类,网上将的很多,本文主要讲讲第一种原因。

java 命令语法

java [ <option> ... ] <class-name> [<argument> ...]

其中<option>是命令选项(以 “-” 开头), <class-name>是完全限定类名,<argument>是需要传入的参数。另外一种执行JAR文件时会略不同,后面再讲。

类的完全限定类名通常在源代码中,如下:

packagename.packagename2.packagename3.ClassName

但是,某些版本的java命令允许使用斜杠而不是句号,例如:

packagename/packagename2/packagename3/ClassName

上面就像一个地址路径,但它不是,完全限定类名(fully qualified classname)是一个java标准术语。

下面是一个java命令的示例:

java -Xmx100m com.acme.example.ListUsers fred joe bert

以上java命令将执行以下操作:

  1. 搜索com.acme.example.ListUsers类的编译版本。
  2. 加载类。
  3. 检查类的main方法签名,由public static void main(String [])确定的返回类型和修饰符。 (注意,参数的名称不是签名的一部分。)
  4. 调用该方法将命令行参数,将(“fred”,“joe”,“bert”)作为String []传递。

找不到或无法加载主类的原因

当收到消息“错误: 找不到或无法加载主类xxx”,意味着第一步就失败了,java命令无法找到类。 事实上,消息中的“xxx”是java正在寻找的完全限定类名。那么为什么可能找不到类呢? 基本上,有两个主要原因。

第一个可能的原因是你提供了错误的类名(或者正确的类名,但是以错误的形式)。考虑到上面的例子,这里有各种错误的方式来指定类名:

例#1 – 只提供简单的类名

java ListUser

当声明该类在包(如com.acme.example)中时,必须在java命令中使用包含包名称的完整类名,例如:

java com.acme.example.ListUser

例#2 – 提供了文件名而不是类名

java ListUser.class
java com/acme/example/ListUser.class

例#3 – 类名大小写错误

java com.acme.example.listuser

例#4 – 类名写错了

java com.acme.example.mistuser