2014年4月16日 星期三

套件 Package: 用 package 管理 - 檔案未切割前

package 宣告語法
   package  package名稱 ;

Java 檔案未切割前

檔案:CarTest0.java
package test0;

class Car {
   public void show() {
     System.out.println("Class Car");
   }
}

class CarTest0 {
   public static void main(String args[]){
     Car car = new Car();
     car.show();
   }
}
編譯後,正常,同時新增 2 個類別檔案:Car.class 與 CarTest0.class
$ javac CarTest0.java

ls -l
total 48
-rw-r--r--  1 elvismeng  staff  395  4  3 12:13 Car.class
-rw-r--r--  1 elvismeng  staff  324  4  3 12:13 CarTest0.class
-rw-r--r--  1 elvismeng  staff  208  4  3 12:12 CarTest0.java
執行時,系統回饋錯誤訊息,為什麼?
$ java CarTest0
Exception in thread "main" java.lang.NoClassDefFoundError: CarTest0 (wrong name: test0/CarTest0)
 at java.lang.ClassLoader.defineClass1(Native Method)
 at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
 at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
 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:425)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
 at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
這是因為我們在 CarTest0.java 第一行新增 package test0; 即將這類別包裝在 test0 這套件中。套件 package 在實體上可被視為檔案夾,因此,我們手動新增一個資料夾,此資料夾必須與程式中的 package名稱一致,在這裏我們新增一個資料夾為 test0,然後將程式移入到此資料夾中。

編譯程式
$ javac test0/CarTest0.java
檢視編譯後結果
$ ls -l test0

total 24
-rw-r--r--  1 elvismeng  staff  395  4  3 12:21 Car.class
-rw-r--r--  1 elvismeng  staff  324  4  3 12:21 CarTest0.class
-rw-r--r--  1 elvismeng  staff  208  4  3 12:12 CarTest0.java
執行結果
$ java test0.CarTest0

Class Car

若不想手動新增資料夾,可用 javac -d 的指令由系統產生
$ javac -d ./ CarTest0.java
檢視編譯結果
$ ls -l test0

total 16
-rw-r--r--  1 elvismeng  staff  395  4  3 12:36 Car.class
-rw-r--r--  1 elvismeng  staff  324  4  3 12:36 CarTest0.class

沒有留言:

張貼留言