当前位置: 代码迷 >> Java相关 >> [求助]请教,可以编译但不能运行【已解决】
  详细解决方案

[求助]请教,可以编译但不能运行【已解决】

热度:186   发布时间:2007-09-18 14:26:44.0
[求助]请教,可以编译但不能运行【已解决】

不好意思,上次就发过这个问题,但一直没能解决,主要是java文件中包含package关键字就不能运行了,但可以编译。《java编程思想第四版》第八章 多态,最开始的几个例子如下:

//: polymorphism/music/Note.java
// Notes to play on musical instruments.
package polymorphism.music;

public enum Note {
MIDDLE_C, C_SHARP, B_FLAT; // Etc.
}

//: polymorphism/music/Instrument.java
package polymorphism.music;
import static net.gondi.util.Print.*;

class Instrument {
public void play(Note n) {
print("Insturment.play()");
}
}

//: polymorrphism/music/Wind.java
package polymorphism.music;

// Wind objects are instruments
// because they have the same interface:
public class Wind extends Instrument {
// Redefine interface method:
public void play(Note n) {
System.out.println("Wind.play() " + n);
}
}

//: polymorphism/music/Music.java
// Inheritance & upcasting.
package polymorphism.music;

public class Music {
public static void tune(Instrument i) {
// ...
i.play(Note.MIDDLE_C);
}
public static void main(String[] args) {
Wind flute = new Wind();
tune(flute); // Upcasting
}
}


就像上次一样,我的意思是,在这个例子中Music.java是带有程序main入口的文件,并且里面有一行package,于是虽然可以通过编译,然而用cmd运行 java Music后就出现这个错误:
Exception in thread "main" java.lang.NoClassDefFoundError: Music (wrong name: po
lymorphism/music/Music)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
4)
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:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

我的java环境变量都设置好了
D:\jdk\MyJavaCodes\TIJCODE_4TH_2\polymorphism\music>java -version
java version "1.6.0_01"
Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)

如果编写的java文件中不含package关键字,但有import导入其他class方法的话,就是可以正常的运行,只要加了package关键字就运行出错。。。555,救命~~
上面的代码是抄书上的,希望热心大侠们用cmd运行试试,看看能运行吗?好像用其他一些IDE可以运行,不过偶还是初学者,想用文本编辑器+CMD学习。。

我用的编辑器是EditPlus + 设置的java编译和运行配置,系统是XP,JDK是1.6的。另,CMD下运行
java -classpath . Music
一样会出现那个错误咯。。

[此贴子已经被作者于2007-9-19 10:43:44编辑过]

搜索更多相关的解决方案: 编译  运行  

----------------解决方案--------------------------------------------------------

你上次那个CADSystem的,我刚刚看了下,也是一样的错误,很奇怪,我在eclipse里面可以正常运行(有package语句),但是在cmd环境下就不能了,研究中


----------------解决方案--------------------------------------------------------
我问了下,终于知道了
你应该在polymorphism目录下运行java 类名,也就是说,你的package是polymorphism.music,那么你应该在polymorphism目录下输入java music/Music
因为你在你的java文件里面有一个package了,编译后生成的class文件里面也有,但是如果你在polymorphism.music下运行的话,他又会去找当前目录下的music/Music.class,明显重复了一次package的操作。只要在你的package第一个目录下执行就行了
----------------解决方案--------------------------------------------------------
回复:(叮叮当)[求助]请教,可以编译但不能运行

您说的意思我明白了,非常感谢~!!
我在CMD下从CLASSPATH根目录开始输入路径就能正常运行了,我的CLASSPATH根目录是TIJCODE_4TH_2,polymorphism也包含在其中,所以CMD中――

D:\jdk\MyJavaCodes\TIJCODE_4TH_2>java polymorphism/music/Music
Wind.play() MIDDLE_C

D:\jdk\MyJavaCodes\TIJCODE_4TH_2>java polymorphism/music3/Music3
Wind.play() MIDDLE_C
Percussion.play() MIDDLE_C
Stringed.play() MIDDLE_C
Brass.play() MIDDLE_C
Woodwind.play() MIDDLE_C

D:\jdk\MyJavaCodes\TIJCODE_4TH_2>java polymorphism/music/Music2
Wind.play() MIDDLE_C
Stringed.play() MIDDLE_C
Brass.play() MIDDLE_C

都可以运行了,哈,非常感谢hwoarangzk大哥的帮助!


----------------解决方案--------------------------------------------------------

不用不用,你的问题也让我学了东西了,呵呵


----------------解决方案--------------------------------------------------------
  相关解决方案