常見問題(及其解決方案)
編譯器的問題
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
如果你選擇此選項,你必須在你的javac
和java
命令之前使用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選項卡中進行管理。