有兩段程式 包(package) Time1.class在檔案夾 D:\Java\testImport\com\deitel\javafp\ch08 中,然後我建立了一個新類:Time1PackageTest.java,當中包含了main方法,並且引用package Time1.class.並且將它放在 D:\Java\testImport2
然後我執行 D:\Java\testImport2>javac -cp D:\Java\testImport 沒有提示錯誤
然後執行 D:\Java\testImport2>java -cp D:\Java\testImport Time1PackageTest
提示錯誤
Code:
Exception in thread "main" java.lang.NoClassDefFoundError: Time1PackageTestCaused by: java.lang.ClassNotFoundException: Time1PackageTest at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source)Could not find the main class: Time1PackageTest. Program will exit.
於是嘗試 D:\Java\testImport2>java Time1PackageTest
Code:
Exception in thread "main" java.lang.NoClassDefFoundError: com/deitel/javafp/ch08/Time1 at Time1PackageTest.main(Time1PackageTest.java:9)Caused by: java.lang.ClassNotFoundException: com.deitel.javafp.ch08.Time1 at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 1 more
time1code:
[code]
package com.deitel.javafp.ch08;
public class Time1 {
private int hour;
private int minute;
private int second;
public void setTime(int h, int m, int s)
{
hour =( ( h>=0 && h < 24)?h:0 );
minute = ( (m>=0 && m<60)?m:0 );
second = ( (s>=0 && s<60)?s:0 );
}
public String toUniversalString()
{
return String.format("%02d:%02d:%02d", hour, minute, second);
}
public String to1String()
{
return String.format("%02d:%02d:%02d %s", ( (hour==0||hour==12)?12:hour%12 ), minute, second, hour>=12?"PM":"AM");
}
}
[/code]
Time1PackageTest code:
[code]
import com.deitel.javafp.ch08.Time1;
public class Time1PackageTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Time1 time1 = new Time1();
System.out.println(time1.toUniversalString());
}
}
[/code]
下面是老外的回答:
Originally Posted by oszc then i execute D:\Java\testImport2>java -cp D:\Java\testImport Time1PackageTest
the error occur:
Code:
Exception in thread "main" java.lang.NoClassDefFoundError: Time1PackageTestCaused by: java.lang.ClassNotFoundException: Time1PackageTest at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source)Could not find the main class: Time1PackageTest. Program will exit.
This is because you only put the directory for the com.deitel.javafp.ch08.Time1 class in the class path, and don't include the current directory (ie the one with the Time1PackageTest class). So it fails to find the Time1PackageTest class.
Originally Posted by
oszc then i execute D:\Java\testImport2>java Time1PackageTest
error again:
Code:
Exception in thread "main" java.lang.NoClassDefFoundError: com/deitel/javafp/ch08/Time1 at Time1PackageTest.main(Time1PackageTest.java:9)Caused by: java.lang.ClassNotFoundException: com.deitel.javafp.ch08.Time1 at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 1 more
In this case you are running without any defined classpath so it defaults to current directory (.). This means it can find Time1PackageTest, since it is in the current directory, but now it can't find the com.deitel.javafp.ch08.Time1 class.
You need both:
-cp .;D:\Java\testImport
我自己的總結
包含兩個路徑 在-cp後面用;號分隔,兩個路徑的先後順序不影響程式的正確執行,也就是被引用包檔案(package)與引用檔案(import)的位置都要列出來,其前後順序不影響程式運行。以上完整啟動並執行命令是:
D:\Java\testImport2>java -cp D:\Java\testImport;. Time1PackageTest