Java™ 教程(常見問題及其解決方案)

博弈發表於2019-01-19

常見問題(及其解決方案)

編譯器的問題

Microsoft Windows系統上常見的錯誤訊息。

`javac` is not recognized as an internal or external command, operable program or batch file

如果你收到這個錯誤,Windows將無法找到編譯器(javac)。

這裡有一種方法可以告訴Windows哪裡可以找到javac,假設你在C:jdk1.8.0中安裝了JDK,在提示符處輸入以下命令並按Enter鍵:

C:jdk1.8.0injavac HelloWorldApp.java

如果你選擇此選項,你必須在你的javacjava命令之前使用C:jdk1.8.0in,每次編譯或執行一個程式時,為了避免這種額外的輸入,請參考JDK 8安裝說明中更新PATH變數的部分。

Class names, `HelloWorldApp`, are only accepted if annotation processing is explicitly requested

如果收到此錯誤,則在編譯程式時忘記包含.java字尾,記住,這個命令是javac HelloWorldApp.java,不是javac HelloWorldApp。

UNIX系統上常見的錯誤訊息

javac: Command not found

如果你收到這個錯誤,UNIX將無法找到編譯器javac

有一種方法可以告訴UNIX在哪裡找到javac,假設你在/usr/local/jdk1.8.0中安裝了JDK,在提示符下輸入以下命令並按回車:

/usr/local/jdk1.8.0/javac HelloWorldApp.java

如果你選擇此選項,那麼每次編譯或執行一個程式時,你都必須在你的javac和java命令之前加上/usr/local/jdk1.8.0/,為了避免這種額外的輸入,你可以將這些資訊新增到PATH變數中,這樣做的步驟將根據當前執行的shell而有所不同。

Class names, `HelloWorldApp`, are only accepted if annotation processing is explicitly requested

如果收到此錯誤,則在編譯程式時忘記包含.java字尾,記住,這個命令是javac HelloWorldApp.java,不是javac HelloWorldApp

語法錯誤(所有平臺)

如果你錯誤地編寫程式的一部分,編譯器可能會發出語法錯誤,訊息通常顯示錯誤的型別、檢測錯誤的行號、行上的程式碼以及程式碼中錯誤的位置,在語句末尾省略分號(;)會導致以下錯誤:

testing.java:14: `;` expected.
System.out.println("Input has " + count + " chars.")
                                                     ^
1 error

有時,編譯器無法猜測你的意圖,如果錯誤級聯超過幾行,則會列印出混亂的錯誤訊息或多個錯誤訊息,例如,下面的程式碼片段省略了粗體行中的分號(;):

while (System.in.read() != -1)
    count++
System.out.println("Input has " + count + " chars."); 

在處理此程式碼時,編譯器發出兩個錯誤訊息:

testing.java:13: Invalid type expression.
        count++
                 ^
testing.java:14: Invalid declaration.
    System.out.println("Input has " + count + " chars.");
                      ^
2 errors

編譯器發出兩個錯誤訊息,因為在它處理count++之後,編譯器的狀態表明它位於表示式的中間,如果沒有分號,編譯器就無法知道語句是否完整。

如果你看到任何編譯錯誤,那麼你的程式沒有成功編譯,編譯器也沒有建立.class檔案,仔細檢查程式,修復你檢測到的任何錯誤,然後再次嘗試。

語義錯誤

除了驗證你的程式語法正確之外,編譯器還檢查其他基本正確性,例如,每次使用未初始化的變數時,編譯器都會警告你:

testing.java:13: Variable count may not have been initialized.
        count++
        ^
testing.java:14: Variable count may not have been initialized.
    System.out.println("Input has " + count + " chars.");
                                       ^
2 errors

同樣,你的程式沒有成功編譯,編譯器也沒有建立.class檔案,修復錯誤並再次嘗試。

執行時的問題

Microsoft Windows系統上的錯誤訊息。

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp

如果你收到此錯誤,java將無法找到你的位元組碼檔案HelloWorldApp.class

java試圖找到.class檔案的地方之一是當前目錄,因此,如果你的.class檔案在C:java中,你應該將當前目錄更改為C:java,若要更改目錄,請在提示符處輸入以下命令,然後按Enter鍵:

cd c:java

他的提示應該更改為C:java>,如果在提示符處輸入dir,應該會看到.java.class檔案,現在再次輸入java HelloWorldApp

如果仍然有問題,你可能需要更改CLASSPATH變數,要檢視是否需要這樣做,請嘗試使用以下命令對類路徑進行截斷。

set CLASSPATH=

現在再次輸入java HelloWorldApp,如果該程式現在可以工作,那麼你必須更改CLASSPATH變數,要設定此變數,請參閱JDK 8安裝說明中更新路徑變數一節,CLASSPATH變數的設定方式相同。

Could not find or load main class HelloWorldApp.class

初學者程式設計師常犯的一個錯誤是嘗試在編譯器建立的.class檔案上執行java啟動程式,例如,如果你試圖使用HelloWorldApp.class而不是java HelloWorldApp執行程式,你將會得到這個錯誤。記住,引數是要使用的類的名稱,而不是檔名。

Exception in thread "main" java.lang.NoSuchMethodError: main

Java VM要求使用它的類有一個main方法來開始執行應用程式,詳解“Hello World!”應用中詳細討論了main方法。

UNIX系統上的錯誤訊息

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp

如果你收到此錯誤,java將無法找到你的位元組碼檔案HelloWorldApp.class

java試圖找到你的位元組碼檔案的地方之一是當前目錄,例如,如果你的位元組碼檔案位於/home/jdoe/java中,你應該將當前目錄更改為該目錄,若要更改目錄,請在提示符處輸入以下命令並按回車:

cd /home/jdoe/java

如果在提示符處輸入pwd,應該會看到/home/jdoe/java,如果在提示符處輸入ls,應該會看到.java.class檔案,現在再次輸入java HelloWorldApp

如果你仍然有問題,你可能需要更改CLASSPATH環境變數,要檢視是否需要這樣做,請嘗試使用以下命令對類路徑進行截斷。

unset CLASSPATH

現在再次輸入java HelloWorldApp,如果該程式現在可以工作,那麼你將必須以與上面的PATH變數相同的方式更改CLASSPATH變數。

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

初學者程式設計師常犯的一個錯誤是嘗試在編譯器建立的.class檔案上執行java啟動程式,例如,如果你試圖使用HelloWorldApp.class而不是java HelloWorldApp執行程式,你將會得到這個錯誤。記住,引數是要使用的類的名稱,而不是檔名。

Exception in thread "main" java.lang.NoSuchMethodError: main

Java VM要求使用它的類有一個主要的方法來開始執行應用程式,詳解“Hello World!”應用中詳細討論了main方法。

Applet或Java Web Start應用程式被阻塞

如果你正在通過瀏覽器執行一個應用程式,並得到安全警告說該應用程式被阻塞,請檢查以下條目:

  • 驗證JAR檔案清單中的屬性是否為應用程式正在執行的環境正確設定,需要使用Permissions屬性,在NetBeans專案中,你可以通過擴充套件專案資料夾和雙擊manifest.mf,從NetBeans IDE的Files選項卡中開啟清單檔案。
  • 驗證應用程式是由一個有效的證照籤名的,並且該證照位於簽名者CA keystore中。
  • 如果你正在執行一個本地applet,請設定一個用於測試的web伺服器,你還可以將應用程式新增到異常站點列表中,該列表在Java控制皮膚的Security選項卡中進行管理。

上一篇:仔細看看“Hello World!”應用程式

下一篇:物件導向程式設計概念

相關文章