很多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命令将执行以下操作:
- 搜索
com.acme.example.ListUsers
类的编译版本。 - 加载类。
- 检查类的
main
方法签名,由public static void main(String [])
确定的返回类型和修饰符。 (注意,参数的名称不是签名的一部分。) - 调用该方法将命令行参数,将(“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
没有评论