編譯器的問題
Microsoft Windows 系統中的公共錯誤消息
'javac' is not recognized as an internal or external command, operable program or batch file /* 'javac' 不是被認可的內部或者外部命令,可操作程序或者批文件 */
如果你接收到這個錯誤,表示 Windows 不能找到編譯器(javac)。
這里有一種方法來告訴 Windows 到哪里尋找 javac。假設你已經把 JDK 安裝在 C:\jdk6 中。你就需要在命令行中輸入下列命令并且按 Enter 鍵:
C:\jdk6\bin\javac HelloWorldApp.java
如果你選擇這個選項,那么當你每次編譯或者運行程序的時候,你都需要在你的 javac 與 java 命令的前面加上 C:\jdk6\bin\。如果要避免額外的輸入,就可以考慮 JDK 6 安裝說明中的[更新 PATH 變量]部分。
Class names, 'HelloWorldApp', are only accepted if annotation processing is explicitly requested /* 類名 'HelloWorldApp' 只在注釋處理明確被請求的時候才是可接受的 */
如果你接收到這個錯誤,表示你在編譯程序的時候忘記了包括 .java 后綴。記住,命令行是 javac HelloWorldApp.java 而不是 javac HelloWorldApp。
UNIX 系統中的公共錯誤消息
javac: Command not found /* javac:沒有找到命令 */
如果你接收到這個錯誤,表示 UNIX 不能找到編譯器(javac)。
這里有一種方法來告訴 UNIX 到哪里尋找 javac。假設你已經把 JDK 安裝在 /usr/local/jdk6 中。那么你就需要在命令行中輸入下列命令并且按 Return 鍵:
/usr/local/jdk6/javac HelloWorldApp.java
提示:如果你選擇這個選項,那么當你每次編譯或者運行程序的時候,你都需要在你的 javac 與 java 命令的前面加上 usr/local/jdk6/。如果要避免額外的輸入,你就可以把這個信息添加到你的 PATH 變量中。并且這個任務的完成步驟也是不同的,這依賴于你當前運行的命令解釋器。
Class names, 'HelloWorldApp', are only accepted if annotation processing is explicitly requested /* 類名 'HelloWorldApp' 只在注釋處理明確被請求的時候才是可接受的 */
如果你接收到這個錯誤,就有可能是你忘記了在編譯程序的時候包括 .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 中,那么你就應該把它改成當前目錄。如果要改變你的目錄,就可以在命令行中輸入下列命令并且按 Enter 鍵:
cd c:\java
現在命令行應該變成了 C:\java>。如果你在命令行中輸入 dir,你應該會看到你的 .java 與 .class 文件。現在重新輸入命令 java HelloWorldApp。
如果你仍然發現有問題,你就需要改變你的 CLASSPATH 變量。如果要了解到這是必需的,你就可以用下列命令來嘗試 classpath 的修復。
set CLASSPATH=
現在重新輸入 java HelloWorldApp。如果程序在工作,就需要改變你的 CLASSPATH 變量。如果要設置這個變量,參考 JDK 6 安裝說明中的[更新 PATH 變量]部分。CLASSPATH 變量的設置方式是相同的。
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp/class
初學的程序員所犯的一個公共錯誤就是嘗試在由編譯器所創建的 .class 文件中運行 java 運載器。例如,如果你嘗試以 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 中,那么你就應該把它改成你的當前目錄。如果要改變你的目錄,就需要在命令行中輸入下列命令并且按 Return 鍵:
cd /home/jdoe/java
如果你在命令行中輸入 pwd,你應該會看到 /home/jdoe/java。如果你在命令行中輸入 ls,你應該會看到你的 .java 與 .class 文件。現在重新輸入 java HelloWorldApp。
如果你仍然發現有問題,你可能需要改變你的 CLASSPATH 環境變量。如果要了解到這是必需的,可以用下列命令來嘗試 classpath 的修復。
unset CLASSPATH
現在重新輸入 java HelloWorldApp。如果程序在工作,你就需要改變你的 CLASSPATH 變量,以上面的 PATH 變量一樣的方式。
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorldApp/class
初學的程序員所犯的一種公共錯誤就是在由編譯器所創建的 .class 文件中運行 java 運載器。例如,如果你嘗試以 java HelloWorldApp.class 替代 java HelloWorldApp 并且運行你的程序,你就會得到這個錯誤。記住,參數是你想要使用的類名稱,而不是文件名。
Exception in thread "main" java.lang.NoSuchMethodError: main
Java VM 要求你所執行的類中有一個 main 方法來開始應用程序的執行。[近距離觀察 Hello World! 應用程序]中就詳細地討論了 main 方法。