- 零基礎(chǔ)學(xué)Java第2版
- 陳潔
- 1360字
- 2018-12-31 19:34:25
1.4 常見(jiàn)疑難解答
對(duì)于初學(xué)者而言,在Java程序的開(kāi)發(fā)、編譯和執(zhí)行過(guò)程中,都或多或少會(huì)遇到問(wèn)題,如環(huán)境變量設(shè)置不正確,源程序的語(yǔ)法錯(cuò)誤、語(yǔ)義錯(cuò)誤,或在程序編譯、運(yùn)行時(shí)發(fā)生錯(cuò)誤等。如果這些錯(cuò)誤或問(wèn)題不能得到適當(dāng)?shù)奶幚恚敲磿?huì)對(duì)初學(xué)者造成很大的障礙,本節(jié)將介紹幾種常見(jiàn)的錯(cuò)誤,以使讀者在學(xué)習(xí)的過(guò)程中少走彎路。
1.4.1 環(huán)境變量設(shè)置錯(cuò)誤

圖1.11 無(wú)法找到Javac可執(zhí)行程序
在編譯并運(yùn)行Java應(yīng)用程序之前,需要設(shè)置環(huán)境變量,其目的是使Windows系統(tǒng)可以知道DOS窗口中運(yùn)行的Java工具可執(zhí)行程序,如Javac源程序編譯工具等。圖1.11說(shuō)明Windows操作系統(tǒng)無(wú)法發(fā)現(xiàn)Javac編譯程序。JDK環(huán)境變量的設(shè)置可以參考第2章的內(nèi)容。
當(dāng)然如果已經(jīng)安裝了JDK,則可以在DOS提示符下輸入Javac的絕對(duì)路徑,通過(guò)絕對(duì)路徑來(lái)識(shí)別該命令的位置。如果采用JBuilder9自帶的jdk,那么目錄為C:\JBuilder9\jdk1.5\bin。也可以在源文件的當(dāng)前路徑下輸入C:\JBuilder9\jdk1.5\bin\Javac HelloWorld.Java。顯然這種方式很煩瑣,因?yàn)槊看尉幾g源文件都要輸入一串路徑和命令信息。讀者可以通過(guò)第2.5節(jié)掌握如何設(shè)置JDK環(huán)境變量。
1.4.2 語(yǔ)法錯(cuò)誤

圖1.12 語(yǔ)法錯(cuò)誤
Java語(yǔ)言規(guī)范設(shè)計(jì)了語(yǔ)法規(guī)則,但是如果疏漏了部分內(nèi)容,違反了Java的語(yǔ)法規(guī)則,編譯器會(huì)發(fā)出語(yǔ)法錯(cuò)誤消息,該消息包含錯(cuò)誤類型、發(fā)生錯(cuò)誤的代碼在程序中的位置(以該錯(cuò)誤代碼行為標(biāo)識(shí))等,并且在錯(cuò)誤處標(biāo)識(shí)一個(gè)“^”。語(yǔ)法錯(cuò)誤如圖1.12所示。
在HelloWorld.Java源程序中將語(yǔ)句System.out.println(“HelloWorld!”)后的分號(hào)去掉,使得程序語(yǔ)句缺少結(jié)束標(biāo)志,這就違反了Java語(yǔ)法規(guī)則。在編譯期發(fā)生任何類型的錯(cuò)誤都會(huì)導(dǎo)致無(wú)法生成.class文件。所以此時(shí)需要讀者仔細(xì)分析錯(cuò)誤類型,細(xì)致檢查程序中的錯(cuò)誤,直到源程序順利通過(guò)編譯。
1.4.3 語(yǔ)義錯(cuò)誤
編譯器也會(huì)發(fā)生語(yǔ)義錯(cuò)誤。編譯器無(wú)法識(shí)別一個(gè)標(biāo)識(shí)的語(yǔ)義,如發(fā)現(xiàn)一個(gè)未定義的變量,錯(cuò)誤輸入了系統(tǒng)類庫(kù)的類的名字等。圖1.13演示了一個(gè)語(yǔ)義錯(cuò)誤,筆者故意將語(yǔ)句System的首字母改為小寫(xiě),使編譯器無(wú)法識(shí)別,從而輸出語(yǔ)義錯(cuò)誤。
注意
Java程序區(qū)分大小寫(xiě)。

圖1.13 語(yǔ)義錯(cuò)誤
1.4.4 運(yùn)行時(shí)錯(cuò)誤
運(yùn)行時(shí)錯(cuò)誤指在執(zhí)行程序過(guò)程中發(fā)生的錯(cuò)誤,如某個(gè)類沒(méi)有實(shí)例化而造成空指針,無(wú)法找到指定的類文件等。下面介紹三種初學(xué)者常見(jiàn)的運(yùn)行時(shí)錯(cuò)誤。
1. 無(wú)法發(fā)現(xiàn)類文件
在用戶編譯或執(zhí)行Java程序時(shí),由于種種原因可能輸入了不正確的類名字,使得編譯器或虛擬機(jī)無(wú)法發(fā)現(xiàn)該文件所在的位置。類文件名輸入錯(cuò)誤如圖1.14所示。

圖1.14 類文件名輸入錯(cuò)誤
在圖1.14中,筆者想運(yùn)行HelloWorld程序,但是輸入了錯(cuò)誤的類名HelloWorldd,所以執(zhí)行系統(tǒng)拋出Java.long.NoClassDefFoundError錯(cuò)誤。
使用Java工具會(huì)啟動(dòng)Java虛擬機(jī),此時(shí)系統(tǒng)會(huì)首先在當(dāng)前目錄下尋找類文件,如果沒(méi)有則默認(rèn)到操作系統(tǒng)的系統(tǒng)環(huán)境變量classpath中搜索。所以讀者也可以在該變量中設(shè)置需要編譯的類文件所在的目錄。
注意
變量的設(shè)置方式可以參考第2.5節(jié)設(shè)置classpath環(huán)境變量。
2. 執(zhí)行Java工具時(shí)類名錯(cuò)誤
對(duì)于初學(xué)者而言,很容易出現(xiàn)的一個(gè)錯(cuò)誤是使用Java執(zhí)行程序時(shí),往往會(huì)輸入類文件名如HelloWorld.class,這是不允許的,此時(shí)會(huì)拋出異常。類名輸入錯(cuò)誤如圖1.15所示。

圖1.15 類名輸入錯(cuò)誤
注意
在調(diào)用Java工具執(zhí)行程序時(shí),需要在其后輸入類名而不是類文件名,如輸入Java HelloWorld才是正確的方式。
3. 無(wú)法發(fā)現(xiàn)main()方法
在第1.3節(jié)已經(jīng)知道,任何Java應(yīng)用程序執(zhí)行的類中必須有main()方法,該方法是程序的入口,通過(guò)它才可以繼續(xù)調(diào)用程序所需的各種其他資源。如果在類中沒(méi)有定義main()方法或該方法書(shū)寫(xiě)錯(cuò)誤,都會(huì)導(dǎo)致圖1.16所示的缺少main()方法錯(cuò)誤。

圖1.16 缺少main()方法錯(cuò)誤
筆者在HelloWorld.Java源程序中修改了main()方法的名字,繼續(xù)編譯并執(zhí)行該程序,虛擬機(jī)將無(wú)法加載該類,因?yàn)闊o(wú)法發(fā)現(xiàn)類HelloWorld的程序入口。
- HTML5+CSS3+JavaScript從入門(mén)到精通:上冊(cè)(微課精編版·第2版)
- 機(jī)器學(xué)習(xí)系統(tǒng):設(shè)計(jì)和實(shí)現(xiàn)
- C和C++安全編碼(原書(shū)第2版)
- Mastering Predictive Analytics with Python
- Scala程序員面試算法寶典
- Learning R for Geospatial Analysis
- 21天學(xué)通C++(第5版)
- Julia for Data Science
- Learning YARN
- Python 3.7從入門(mén)到精通(視頻教學(xué)版)
- 計(jì)算機(jī)應(yīng)用基礎(chǔ)教程(Windows 7+Office 2010)
- 從0到1:HTML5 Canvas動(dòng)畫(huà)開(kāi)發(fā)
- Mastering Android Studio 3
- Python機(jī)器學(xué)習(xí)開(kāi)發(fā)實(shí)戰(zhàn)
- jBPM6 Developer Guide