java java.lang.NoClassDefFoundError 的解決辦法

來源:互聯網
上載者:User
java java.lang.NoClassDefFoundError 的解決辦法

(2008-12-23 01:14:03)

轉載

標籤:

javanoclassdeffound解決辦法
 

以簡單而經典的 “HelloWorld.java” 為例

不含包層次的HelloWorld.java

  public class HelloWorld

      {

        public static void main(String[] args)

             {

                    System.out.println("Hello World!");

             }

     }

  儲存在E:/java/src下,命令列下,改變當前路徑到:E:/java/src,使用javac命令編譯:

  E:/java/src>javac HelloWorld.java

  運行:

  E:/java/src>java HelloWorld

  螢幕列印出:

  Hello World!

  初學者常犯的錯誤

  1. 運行時,帶了.class尾碼

  如果你試圖使用如下命令:

  E:/java/src>java HelloWorld.class

   系統會誤認為你啟動並執行是HelloWorld包下的名為class的類檔案,會到系統的CLASSPATH下(一般都包括目前的目錄)企圖尋找 HelloWorld.class.class這樣的類,這樣的類當然不存在了;並且也不可能存在,因為class是關鍵字,不能作為一個類的名字。所以 會報如下錯誤資訊:

  Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/class

  2. 檔案名稱大小寫錯誤

  對於像Windows這樣的系統,編譯時間可以不關心大小寫。比如編譯HelloWorld.java時,也可以使用:

  E:/java/src>javac helloworld.java

  也可以編譯通過,但產生的類檔案仍然是和源檔案相符的:HelloWorld.class。

  但在運行時一定要注意大小寫,比如試圖使用如下命令運行:

  E:/java/src>java helloworld

  將報類似於1中的錯誤:

  Exception in thread "main" java.lang.NoClassDefFoundError: helloworld (wrong name: HelloWorld)

  包含包層次的HelloWorld.java

  比如上面的HelloWorld.java修改如下:

   package org.javaresearch;

        public class HelloWorld

          {

              public static void main(String[] args)

             {

                    System.out.println("Hello World!");

             }

         }


  編譯時間有兩種方法

  1. 直接編譯

  E:/java/src>javac HelloWorld.java

  此時在目前的目錄下輸出HelloWorld.class。此時,運行不能使用上面相同的方法,使用:

  E:/java/src>java HelloWorld

  運行時,出現如下錯誤:

  Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: org/javaresearch/HelloWorld)

   從上述錯誤資訊你也可以看到,系統可以找到HelloWorld類(因為當前路徑包含在CLASSPATH中,具體為什麼會提示wrong name,有興趣的朋友參見Java語言規範),但這個類屬於org.javaresearch包。所以,你要做的就是按照上述包層次,相應的建立目錄層 次,把上面產生的HelloWorld.class放到E:/java/src/org/javaresearch/目錄下。運行(這時候是在包層次的最高層目錄下啟動並執行):

  E:/java/src >java org.javaresearch.HelloWorld

  系統列印出:

  Hello World!

  這兒要注意的是,不能使用java org/javaresearch/HelloWorld來運行,此時同樣會出現如下錯誤:

  Exception in thread "main" java.lang.NoClassDefFoundErrorrg/javaresearch/HelloWorld (wrong name: org/javaresearch/HelloWorld)

  因為類名的書寫是用句點來分割包名的層次的,引用java類庫裡面的類也可以這樣寫:java.util.List  類的全名就是這樣的,我們如果在 import 語句裡寫上 import java.util.List;

那麼,就不用寫全名了,直接寫 List list = new ...;java 編譯器就可以知道是 List 什麼類.但是,由於,java.util 這個包 和 java.sql 這個包都有一個 Date 類,所以,如果 同時匯入這兩個包,那麼會

導致java 編譯器不知道引用那個類,有兩種解決辦法:

a. 用全名來引用類:java.util.Date date1 = ...;java.sql.Date date2 = ...;

b. 不要匯入整個包,只匯入所需要的類,如果你同時需要這兩個 Date 類,那麼只能寫全名了,如果

你不是同時需要這兩個類,你可以只匯入需要的包:

比如:import java.util.List; import java.sql.Date;這樣就不會衝突,因為編譯器可以十分清楚的區分

這個 Date 類是 java.sql 包中的, java.util 包中的 Date 類根本就沒有匯入進來。

這一點,可以按照常理來理解,還是比較好理解的。

  2. 使用 -d <directory>編譯選項

  是不是覺得上面的編譯方法有點麻煩,能不能自動在當前路徑(或任意指定的路徑)下產生包層次呢?有!使用-d <directory>編譯選項就能做到。

  E:/java/src >javac

(其中的點表示目前的目錄。d 和 . 之間有空格, .和後面的java檔案名稱之間也有空格)

  此時,在目前的目錄下就產生了一個org/javaresearch目錄,並且輸出的.class檔案也在裡面。運行:

  E:/java/src >java org.javaresearch.HelloWorld

  系統列印:Hello World!

  如果你想把產生的類檔案集中存放在一個目錄中,比如:E:/java/classes下,那麼你首先建立這個目錄,然後編譯時間:

  E:/java/src >javac -d E:/java/classes HelloWorld.java

   就可以把產生的類檔案放到E:/java/classes目錄下,並且按照包層次相應的建立目錄路徑。你可以在E:/java/classes/org / javaresearch下找到HelloWorld.class檔案。此時使用如下命令可以正確運行(注意如果要用到其它類,請在CLASSPATH中 設好):

  E:/java/classes >java org.javaresearch.HelloWorld

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.