天天看點

JAVA新人常犯錯誤集錦

      學習程式設計,最怕的事情可能就是遇到錯誤卻找不到錯在哪裡。這裡列舉一下筆者發現的JAVA新人常犯的錯誤,供目前正在上筆者JAVA課程的學生參考,其他JAVA初學者亦可借鑒。

1、源程式檔案字尾名名義上是.java而實際上是.txt

      JAVA要求源程式檔案的字尾名為.java。也許是為了防止使用者不小心更改了檔案的字尾名,Windows預設情況下是隐藏字尾名的,這就為初學者犯錯埋下了隐患。此時,我們建立一個文本檔案,然後把它的“字尾名”改為.java,如下圖所示:

<a href="http://blog.51cto.com/attachment/201211/121519355.png" target="_blank"></a>

      表面上看,它的檔案全名是HelloWorld.java,然而當你編譯時卻報“找不到檔案”的錯誤,如下圖所示:

<a href="http://blog.51cto.com/attachment/201211/141844485.png" target="_blank"></a>

      運作dir指令,顯示目前目錄下的所有目錄和檔案,這個檔案就會露出它的廬山真面目。如下圖所示:

<a href="http://blog.51cto.com/attachment/201211/142033253.png" target="_blank"></a>

      可以看出,它的字尾名仍然是.txt。Windows隐藏了檔案的字尾名,是以當我們把檔案更名為HelloWorld.java時,并沒有改掉它的字尾名,.java隻是檔案名的一部分,并非為字尾名。

      解決辦法是不要讓Windows隐藏檔案的字尾名。打開“我的電腦”,點選頂部菜單欄的“工具”-&gt;“檔案夾選項”,打開“檔案夾選項”對話框,點選“檢視”标簽,在“進階設定”中,清除掉“隐藏已知檔案類型的擴充名”前面的勾選。如下圖所示:

<a href="http://blog.51cto.com/attachment/201211/143553778.png" target="_blank"></a>

      确定後,我們就可以在Windows下清楚地看到檔案“HelloWorld.java”的真實面目了。如下圖所示:

<a href="http://blog.51cto.com/attachment/201211/144128949.png" target="_blank"></a>

2、沒有區分中英文

      在JAVA語言中(實際上其他語言諸如C也一樣),起特殊作用的分号“;”、括号(包括圓括号“()”、中括号“[]”、大括号“{}”),以及雙引号“""”、單引号等,都必須是英文的。若不小心輸入為中文的,就會報文法錯誤。此類錯誤對于初學者來說非常隐蔽,常會耗費大量的時間和耐心。以分号為例,可采用如下方法檢測是不是誤寫為中文的了:按快捷鍵Ctrl+F,可打開搜尋對話框,輸入中文的分号,讓它搜尋,看搜尋到的分号是不是應該寫為英文的。為保證能對整個程式檔案進行搜尋,可在搜尋前預先把光标移動到程式的開始處。因為搜尋預設情況下是從目前光标處搜尋到檔案尾,光标之前的内容不會搜尋到。或者使用某些搜尋選項,讓它搜尋完整個檔案。分别以EditPlus和Windows的記事本編輯器示例如下:

      Editplus,确認選中紅框中的選項。

<a href="http://blog.51cto.com/attachment/201211/133219268.png" target="_blank"></a>

      記事本:如下圖,預設向下搜尋。向下搜尋完後,再點選“向上”,讓它向上搜尋。

<a href="http://blog.51cto.com/attachment/201211/133256429.png" target="_blank"></a>

3、括号、引号等不配對

      在程式中,圓括号(())、方括号([])、大括号({})以及雙引号("")和單引号必須成對出現,否則報錯。如以下的的錯誤“進行文法解析時已到達檔案結尾”,即是因為少了一個右大括号。為避免發生此類錯誤,可先把左右括号/引号寫好,然後再往裡面添加代碼。

4、缺少大括号

   對于if/else和循環,若隻需執行一條語句,可以不用大括号。但是當需要添加語句時,就需要用大括号把多條語句包含起來。這一點容易被忽略,而一旦被忽略,就是邏輯錯誤(程式能運作,但結果不對)。排查邏輯錯誤要比文法錯誤困難很多,因為編譯器不會報錯,是以常常會耗費大量時間和耐心。是以,為避免這類錯誤,應養成習慣:即使隻執行一條語句,也應用大括号包含。

5、類名/變量名寫錯或沒有區分大小寫

    類名應保證正确,變量定義後,再使用此變量也應該保證與定義時的名字一緻。更容易出錯的是,JAVA是區分大小寫的語言,有人把String寫成string,或者同一個變量名,前後使用時大小寫不一緻,都會報錯。是以,當編譯器報“找不到符号”的錯誤時,就應該根據編譯器的錯誤提示資訊仔細檢查相關類名/變量名是不是這兩方面犯了錯。例如,下圖的錯誤分别是把類String寫成了string,以及定義了變量scan,但使用此變量時卻寫成了sscan。

<a href="http://blog.51cto.com/attachment/201211/133409492.png" target="_blank"></a>

6、公共類名應與檔案名同名

      我們一般寫的類都是公共的(public),JAVA要求儲存公共類的檔案的檔案名必須與類同名,而且要注意大小寫。否則會報錯:類XX是公共的,應在名為XX.java的檔案中聲明。這裡的“XX”指代某個類名,以下亦然。

7、修改後未儲存或未重新編譯

      發現錯誤更改後未儲存,這時修改并未生效,是以應該首先儲存。儲存後還應重新編譯生成新的位元組碼檔案(.class)檔案,因為真正運作的是位元組碼檔案。不重新編譯的話,運作的還是舊的位元組碼檔案。

8、錯誤:僅當顯式請求注釋處理時才接受類名稱“XX.JAVA”

      這個錯誤是前一段時間批改學生程式時遇到的,程式本身沒有發現任何問題,隻是檔案名寫成了XX.JAVA,一時我也不知道錯在哪裡。後來把檔案字尾名.JAVA改為.java,就好了。由于筆者寫程式時一直把字尾名寫為.java,是以一直未遇到這種問題(或者遇到了,但是忘記了)。看到大寫的字尾名後,潛意識裡認為字尾名屬于Windows的概念,而Windows是不區分大小寫的,是以也未在意。但我當時顯然忽略了一點,當我們用javac指令編譯程式時,javac是JAVA的東西,它對于将要編譯的檔案的檔案名,是區分大小寫的。是以,檔案名XX.JAVA與XX.java對它來說,是不一樣的。正如上面的第三條所講,公共類名應與檔案名同名,而且要注意大小寫。而如果我們把javac寫成JAVAC,則沒有問題。因為javac指令是Windows幫我們調用的,它不區分大小寫。

9、設定classpath環境變量時忘了添加目前目錄

      在不使用IDE的情況下,若要引用第三方jar包,需把這些jar包引入到classpath環境變量中。但若設定classpath時,沒有包含目前目錄(.),那麼即使是在位元組碼檔案所在的目錄使用java指令運作此位元組碼檔案,也會報java.lang.NoClassDefFoundError。這是因為若不設定classpath,則classpath自動包含目前目錄;而若設定後,則不再自動包含目前目錄,需要我們顯式指定包含,這一點與path環境變量不同。

10、方法調用沒有參數時遺漏了圓括号

      與C一樣,JAVA中調用方法,即使沒有參數,也應帶上圓括号。犯這種錯誤,說明基礎知識不牢固。

11、import語句位置不對

      例如以下程式:

import java.text.DecimalFormat;  

class A  

{  

}  

import java.util.Scanner;  

class B  

      則會報第7行出錯:“需要為 class、 interface或enum”。這是因為import語句應寫在類定義之前,不能在兩個類的定義之間出現import語句。是以,上述程式應修改如下:

      為避免此類錯誤,建議每個類寫在單獨的檔案中。

      (發現其他問題,将繼續更新)

本文轉自 NashMaster2011 51CTO部落格,原文連結:http://blog.51cto.com/legend2011/1057901,如需轉載請自行聯系原作者