为了账号安全,请及时绑定邮箱和手机立即绑定

带包名的.class文件为何不能在.class文件所在目录运行

带包名的.class文件为何不能在.class文件所在目录运行

慕后森 2019-03-22 14:15:49
大家好,我的问题是这样的,我在G:/javaTest文件下建立的Hello.java,源码如下:package gdgz.lwj; public class Hello{    public static void say(){   System.out.println("hello,java!");   }   public static void main(String args[]){    Hello.say();    }  }当我在G:/javaTest 目录下执行 javac -d . Hello.java文件后,再执行 java gdgz.lwj.Hello 执行成功,但是当我进入G:/javaTest /gdgz/lwj目录(也就是Hello.class文件所在目录) 执行 java Hello时就G:/javaTest 出错了,具体如下G:\javaTest>java gdgz.lwj.Hellohello,java!G:\javaTest>cd gdgzG:\javaTest\gdgz>cd lwjG:\javaTest\gdgz\lwj>java HelloException in thread "main" java.lang.NoClassDefFoundError: Hello (wrong name: gdgz/lwj/Hello)        at java.lang.ClassLoader.defineClass1(Native Method)        at java.lang.ClassLoader.defineClass(ClassLoader.java:621)        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)        at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)        at java.net.URLClassLoader.access$000(URLClassLoader.java:56)        at java.net.URLClassLoader$1.run(URLClassLoader.java:195)        at java.security.AccessController.doPrivileged(Native Method)        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)Could not find the main class: Hello.  Program will exit.我们知道如果刚才的Hello.java文件没有带包名,也就是package内容,我们是可以在.class文件所在目录去运行的,我不明白的就是为什么带了包名后了就不能在.class文件所在的目录下去运行,请大家指教。
查看完整描述

5 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

新手最容易犯的错误。

可以在任意目录下执行Java命令。但需要注意:

1、Java命令的参数是“类的完整类名”,而不是“文件名”。
所以,不管在任何目录下运行gdgz.lwj.Hello类,都不能简单写作java Hello,
而需要写成下面形式:

2、如果类路径不在当前目录下,就需要自己设置classpath参数。

例如:
G:\javaTest>java gdgz.lwj.Hello
或者
G:\javaTest\gdgz\lwj>java -cp G:\javaTest gdgz.lwj.Hello
或者
任意目录下>java -cp G:\javaTest gdgz.lwj.Hello


查看完整回答
反对 回复 2019-04-28
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

应该在G:/javaTest下执行:
java gdgz.lwj.Hello

编译的时候直接指定文件就行了,但是执行的时候肯定是需要带包名的。


查看完整回答
反对 回复 2019-04-28
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

这是classpath设置问题 如果你设置为 . 默认就是到当前目录去找类 执行

此时你可以设置classpath为
.;G:/javaTest


查看完整回答
反对 回复 2019-04-28
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

是不是因为jvm找到的.class文件包名是gdgz/lwj/ 与命令不符。

具体是不是得看看jvm如何执行的了? 高手回答吧


查看完整回答
反对 回复 2019-04-28
  • 5 回答
  • 0 关注
  • 578 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信