新手求问package和import的问题??
我的两个源文件:
文件1:Cookie.java
package com.wym.access.dessert;
public class Cookie
{
public Cookie() {
System.out.println("Cookie constructor");
}
void bite() { System.out.println("bite"); }
}
文件2:Dinner.java
package com.wym.access.dessert;
import com.wym.access.dessert.Cookie;
public class Dinner
{
public static void main(String[] args) {
Cookie x = new Cookie();
x.bite(); // Can't access
}
}
将以上两个文件的package和import语句都注释掉,放在同一个文件夹内,使用默认的包权限。然后命令行输入
javac Dinner.java;java Dinner后程序可以输出正确的结果。但是加入package和import语句后,执行javac Dinner.java编译没有错误,执行java Dinner时弹出如下异常提示:
D:\java4th_classlib\com\wym\access\dessert>javac Dinner.java
D:\java4th_classlib\com\wym\access\dessert>java Dinner
Exception in thread "main"
java.lang.NoClassDefFoundError: Dinner (wrong name: c
om/wym/access/dessert/Dinner)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
2)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:472)
求高手解答是怎么回事?我的CLASSPATH设置为:
.;D:\java4th_classlib;C:\Program Files\Java\jdk1.7.0\lib\dt.jar;C:\Program Files\Java\jdk1.7.0\lib\tools.jar
------解决方案--------------------然后在:
D:\java4th_classlib> 这里执行java com.wym.access.dessert.Dinner
------解决方案--------------------
你把自己当jvm想想就就知道了,当你执行java Dinner:
1、明确要执行的类是根路径的Dinner类下的main函数;
2、查找CLASSPATH,看有没有Dinner.class;
3、查看Dinner.class是否其包路径为根;// 这里就失败了
4、查找Dinner.class有没有main函数;
5、调用该main函数。
反之如果你执行:java com.wym.access.dessert.Dinner:
1、明确要执行的类是com.wym.access.dessert路径的Dinner类下的main函数;
2、查找CLASSPATH,看有没有com目录,进而看看有没有wym目录,然后是access目录,最后是desser目录,有没有Dinner.class;
3、查看Dinner.class其包路径是否为com.wym.access.dessert;
等等...