3-2 編譯 Java 程式

Java 語言屬於高階語言,但電腦只懂得低階的機器語言,在撰寫好 Java 原始程式之後,您需要一個翻譯員將原始程式翻譯為電腦所能理解的機器語言,這個翻譯員就是編譯器( Compiler ),編譯器不只幫您進行翻譯,它還會協助您檢查出程式中的一些語法或邏輯錯誤。

這個小節中將告訴您:

  • 使用 javac 編譯器工具程式
  • 看懂編譯器所提供的錯誤訊息

• 使用 javac 編譯器工具程式

要使用 javac 工具程式必須在文字模式下進行,假設您的Java 原始程式是位於 C:\workspace 資料夾下,名稱為 HelloWorld.java,請開啟文字模式視窗,執行以下指令:

圖3-10、使用 javac 編譯*.java 檔案

您切換至 C:\workspace 資料夾下,執行 javac 工具程式並指定要編譯的*.java 檔案,如果指定的 Java 原始碼檔案沒有任何的錯誤,則編譯完成後不會有任何錯誤訊息出現,這時您的 C:\workspace 下應該會出現一個 HelloWorld.class檔案。

圖3-11、編譯完成後會出現*.class 檔案

對於每一個 Java 類別,編譯完成後都會出現一個與類別名稱相同,而副檔名為*.class 的檔案,這個檔案是位元碼( byte-code )格式,在執行 Java 程式時,會被 Java 虛擬機器轉換為目標平台所認識的原生碼( Native code )

那麼 javac 工具程式到底作了什麼事情?您可以在執行javac 指令的時候,同時使用-verbose 選項,則執行編譯時的每一個步驟都會被顯示出來,例如:

圖3-12、使用-verbose 選項顯示編譯細節

編譯器首先會剖析*.java原始檔案,進行一些基本的語法檢查,接著搜尋原始碼路徑(可使用-sourcepath 選項設定)查看有無指定的相關類別之原始碼,然後搜尋類別路徑(可使用-classpath 選項設定)查看有無指定且已編譯完成的類別檔案,接著載入相關類別(例如 System、String 類別)以獲取類別資訊,編譯完成後將編譯結果寫至*.class 檔案。

關於-sourcepath 與-classpath 使用,稍後在介紹Classpath 時會一併介紹。

初學者可記得這個基本流程,了解編譯器為您代辦了哪些事情,基本上如果程式原始碼沒有寫錯,則不必在編譯時加上-verbose 選項,直接使用 javac 指令並指定原始檔案,接下來的工作交給編譯器即可。

有時將程式的*.java 檔案與編譯完成的*.class 檔案分開放置,在程式的檔案管理上是個不錯的方式,假設您的*.java檔案是放置在 C:\workspace\src 下,而您打算將編譯完成的*.class 檔案放置在 C:\workspace\classes 下,則您可以使用-d 選項指定編譯完成後*.class 的置放路徑,例如:

圖3-13、使用-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

撰寫程式的過程中輸入了不合法的字元,通常的原因是您輸入了全型字元,例如全型空白,請去除或修正這些不合法的字元。