我的两个源文件:文件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.javaD:\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

解决方案 »

  1.   

    加入了package以后,你的class文件所在目录必须跟包路径匹配,才能正常执行。比如你的包如果是:
    package xxx.ooo;那么你的class文件应该放在
    D:\java4th_classlib\com\wym\access\dessert\xxx\ooo\Dinner.class 这里然后在:
    D:\java4th_classlib\com\wym\access\dessert> 这里执行java Dinner
      

  2.   

    然后在:
    D:\java4th_classlib> 这里执行java com.wym.access.dessert.Dinner
      

  3.   

    我的两个源文件本来就是放在D:\java4th_classlib\com\wym\access\dessert\下的,按照你说的我又创建了新的文件夹D:\java4th_classlib\com\wym\access\dessert\com\wym\access\dessert,将.class文件移了进去,还是弹出上面的异常提示。不知道是什么问题?高手可不可以帮我把程序在你的机器上运行下。多谢!!
      

  4.   

    哦,那你多此一举了也就是:
    D:\java4th_classlib\com\wym\access\dessert\Dinner.class然后你这样:
    D:\java4th_classlib>java com.wym.access.dessert.Dinner
      

  5.   

    多谢,在D:\java4th_classlib> 这里执行java com.wym.access.dessert.Dinner,程序正常执行了,为什么我在D:\java4th_classlib\com\wym\access\dessert下执行java Dinner不行呢?我的classpath不是将本地目录“.”加进去了吗?
      

  6.   

    要多多理解:加入了package以后,你的class文件所在目录必须跟包路径匹配,才能正常执行。换句话说,java都是按照目录结构来查找你的类文件并匹配类文件所在包的。
      

  7.   

    试了一下这样可行,为什么我在D:\java4th_classlib\com\wym\access\dessert下执行java Dinner不行呢?我的classpath不是将本地目录“.”加进去了吗?
      

  8.   

    你把自己当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;
    等等...
      

  9.   

    嗯,终于弄明白了,是我对JVM的运行机制不太了解。真的非常感谢!!
      

  10.   

    可以用javac -d com.wym.access.dessert Dinner.java
    -d 是表示当前路径下的你所在的这个包,这样就可以简便很多