标签:退出 targe print 过程 ati 匹配 div ima blog
在实际开发过程中,我们都是使用集成开发工具,很少使用命令行去执行 java 程序。今天在看书时,编写了书上的例子,照着书上使用命令行来执行(书上可能是为了简便),发现报错说找不到类文件,可是仔细检查类文件路径发现并没有问题。后来才知道原来是 java 命令对 class 文件的包名的强依赖原因造成的。自己重新写一遍,加深印象。
转自:使用 java 命令运行 class 文件报错找不到文件问题
1. 报错详情
2. java 源文件路径
D:\project\onezai\ThinkingJavaDemo\src\oz\s2\s11\Train10.java
3. java 代码
package oz.s2.s11; public class Train10 { public static void main(String[] args){ System.out.println(args[0]); System.out.println(args[1]); System.out.println(args[2]); } }
4. 编译
进入到源文件的包目录下:D:\project\onezai\ThinkingJavaDemo\src\oz\s2\s11
编译成功,并生成了 class 文件:
5. 执行
可以看到,报错了。可是明明 class 文件是存在的呀!
6. 分析
报错的原因就是,java 在加载 class 文件时,发现 class 文件声明的包名是 oz.s2.s11,而上述执行命令并没有指定包名,所以包名不匹配,就报错了。
正确的做法是,退出到包路径的最外层,然后使用 java oz.s2.s11.Train10 来执行,这个时候,java 会将点分的包名转化成路径,然后查找到 class 文件,而刚好的命令行传递的包名和找到的 class 文件声明的包名一致,这样就对上了,结果:
7. 细思
既然我们知道了报错的原因是 命令行传入的包路径和找到的 class 声明的包路径不一致,那么假如我们现在非要在 D:\project\onezai\ThinkingJavaDemo\src\oz\s2\s11 路径下执行 Train10.class 文件,是不是只需要人为地创造一个相同的包路径就可以呢?答案是:是的。例如:
只不过,我们现在执行的 class 文件是这个路径:D:\project\onezai\ThinkingJavaDemo\src\oz\s2\s11\oz\s2\s11
想想路径和包名的微妙关系,其实可以猜想:在前面的报错中 “找不到或无法加载主类”,应该是 “无法加载”,而不是 “找不到”。其实找应该是找到了,只是与找到的 class 文件声明的包名不一致,java 认为这样不合法,所以报错了。
标签:退出 targe print 过程 ati 匹配 div ima blog
原文地址:https://www.cnblogs.com/coding-one/p/12799344.html