Java 語言屬於高階語言,但電腦只懂得低階的機器語言,在撰寫好 Java 原始程式之後,您需要一個翻譯員將原始程式翻譯為電腦所能理解的機器語言,這個翻譯員就是編譯器( Compiler ),編譯器不只幫您進行翻譯,它還會協助您檢查出程式中的一些語法或邏輯錯誤。
這個小節中將告訴您:
要使用 javac 工具程式必須在文字模式下進行,假設您的Java 原始程式是位於 C:\workspace 資料夾下,名稱為 HelloWorld.java,請開啟文字模式視窗,執行以下指令:
您切換至 C:\workspace 資料夾下,執行 javac 工具程式並指定要編譯的*.java 檔案,如果指定的 Java 原始碼檔案沒有任何的錯誤,則編譯完成後不會有任何錯誤訊息出現,這時您的 C:\workspace 下應該會出現一個 HelloWorld.class檔案。
對於每一個 Java 類別,編譯完成後都會出現一個與類別名稱相同,而副檔名為*.class 的檔案,這個檔案是位元碼( byte-code )格式,在執行 Java 程式時,會被 Java 虛擬機器轉換為目標平台所認識的原生碼( Native code )。
那麼 javac 工具程式到底作了什麼事情?您可以在執行javac 指令的時候,同時使用-verbose 選項,則執行編譯時的每一個步驟都會被顯示出來,例如:
編譯器首先會剖析*.java原始檔案,進行一些基本的語法檢查,接著搜尋原始碼路徑(可使用-sourcepath 選項設定)查看有無指定的相關類別之原始碼,然後搜尋類別路徑(可使用-classpath 選項設定)查看有無指定且已編譯完成的類別檔案,接著載入相關類別(例如 System、String 類別)以獲取類別資訊,編譯完成後將編譯結果寫至*.class 檔案。
註
關於-sourcepath 與-classpath 使用,稍後在介紹Classpath 時會一併介紹。
初學者可記得這個基本流程,了解編譯器為您代辦了哪些事情,基本上如果程式原始碼沒有寫錯,則不必在編譯時加上-verbose 選項,直接使用 javac 指令並指定原始檔案,接下來的工作交給編譯器即可。
有時將程式的*.java 檔案與編譯完成的*.class 檔案分開放置,在程式的檔案管理上是個不錯的方式,假設您的*.java檔案是放置在 C:\workspace\src 下,而您打算將編譯完成的*.class 檔案放置在 C:\workspace\classes 下,則您可以使用-d 選項指定編譯完成後*.class 的置放路徑,例如:
編譯時路徑的指定使用點號 . 開始表示相對路徑,您也可以指定絕對路徑,如果不指定-d 選項,則預設編譯完成的*.class 是與*.java 的所在位置放在一起。
之前總是假設您所有的操作都是正確的,然而對於 Java 初學者來說,有時並不會那麼的順利,這邊假設您犯了某些錯誤,有一些錯誤訊息提供給您,讓我們來看看問題出在哪邊?
'javac' 不是內部或外部命令、可執行的程式或批次檔。事實上這並不是編譯器的錯誤訊息,而是作業系統告知的訊息,它告訴您找不到 javac 工具程式的所在,請重新複習第二章節,了解如何設定 Path 環境變數。
error: cannot read: HelloWorld.java編譯器找不到您所指定的檔案,請確定 HelloWorld.java 存在,並且路徑沒有指定錯誤;還有一種可能性就是由於您的作業系統沒有顯示出副檔名,您的檔案事實上可能是HelloWorld.java.txt,請看看前一個小節,了解如何正確的設定原始檔案的副檔名為*.java。
class HelloWorld is public, should be declared in a file named HelloWorld.java您定義了一個公開( public )類別,但是該類別的名稱與檔案的主檔名不同,Java 規定公開類別必須與所在檔案的主檔名相同。
cannot find symbol這通常是打錯了方法或變數名稱所導致,或者是沒注意到大小寫問題,在 Java 中英文名稱的大小寫是有所區別的,請檢查看看每一個字母的大小寫都是正確的。
package system does not exist找不到指定的類別或套件(package)名稱,請確定類別名稱沒有打錯,再次強調,Java 中對於字母大小寫是有所區分的(例如在這邊,您也許該將 system 改成 System)。
HelloWorld.java:4: ';' expected每個陳述句結束時必須要加上分號,顯然的您忘記了這點。
illegal character: \12288撰寫程式的過程中輸入了不合法的字元,通常的原因是您輸入了全型字元,例如全型空白,請去除或修正這些不合法的字元。