2010-05-06 51 views
4

在代碼:爲什麼我必須給一個標識符?

try 
{ 
    System.out.print(fromClient.readLine()); 
} 
catch(IOException)//LINE 1 
{ 
    System.err.println("Error while trying to read from Client"); 
} 

在代碼行標記爲LINE 1編譯器會強迫我放棄,即使我不使用它的標識符。爲什麼這種不自然的約束?然後,如果我輸入一個標識符,我會收到警告,說明標識符未被使用。這對我來說沒有任何意義,迫使程序員去做一些不必要的和過剩的事情。在我之後有人會修改這段代碼,並想知道如果我沒有在purpouse上使用這個變量,或者我忘記了。所以爲了避免這種情況,我必須寫出額外的評論,解釋爲什麼我不使用我的代碼中不需要的變量。
謝謝

+0

我不明白你的第一句話是什麼意思。如果您從編譯器發佈錯誤消息,那將會有很大幫助。 – 2010-05-06 13:37:42

+2

可能編譯器需要'IOException var'。不知道爲什麼這樣的約束,但是,語言是語言,它有它的語法... – 2010-05-06 13:39:44

+0

@Andrzej編譯器強制我(不會編譯),直到行中標記爲LINE 1我會給IOException的標識符 – 2010-05-06 13:40:09

回答

10

需要標識符名稱才能使編譯器的解析變得更簡單。而在catch子句省略例外是 認爲是不好的做法 恕我直言很少是個好主意 - 在生產代碼,你應該(幾乎總是)打印/記錄它和/或重新拋出。所以不使用標識符名稱應該是例外(不是雙關語)而是規則。

但如果你真的有一個很好的理由 省略 不使用它,您可以添加評論,說明你的觀點,[UPDATE2]和/或要告訴你的IDE來抑制樣的檢查爲特定的代碼塊(大多數IDE允許)[/ Update2]

更新:好吧,「不好的做法」可能太強大了:-)讓我試着更好地解釋我的觀點。

我的意思是,通常當你捕捉異常,最好嘗試登錄/使用盡可能多的信息出來的,你可以。這意味着你實際上引用了異常變量。

在你上面的例子,如果你只登錄「錯誤,而試圖從客戶端讀取」,那是一個信息非常有限。問題的實際原因可能是(只是幾個猜測)損壞的文件,網絡錯誤,格式錯誤...在IOException中記錄數據將提供更多關於它的詳細信息,使問題更容易修復。

+1

「被認爲有害」的物品被認爲是有害的。 – 2010-05-06 13:40:34

+1

@Peter,但我並沒有忽略這個例外。我只是沒有使用它。你想告訴我,在catch子句中不使用異常也是一種不好的做法嗎? – 2010-05-06 13:41:55

+1

@認識我,知道你 - 你應該做一些事情,抓住例外。請看http://stackoverflow.com/questions/2142184/is-it-okay-that-i-sometimes-sink-my-exceptions – justkt 2010-05-06 13:42:55

0

在你的捕獲中,你正在定義被捕獲的變量,而不僅僅是異常的類。它類似於語義上的IOException ex = new IOException()。而且你應該使用這個變量。在SO上看到Is it okay that I sometimes sink my exceptions的所有理性。記錄異常,就像你在做的那樣,提供一些信息。不過,理想情況下,你的代碼應該以某種方式處理異常,即使只是向客戶端報告錯誤(如果你的應用程序是一個控制檯應用程序,它會這樣做)。

如果您有catch(IOException ex),您還可以使用ex.printStackTrace()獲取完整堆棧跟蹤,使用本地化消息等。這對調試很有幫助。嘗試一下!

你可以在Exceptions tutorial的更多信息。

作爲一個有趣的注意,在Java 7中,捕獲異常的語法有望小幅改變,因爲multicatch和最終的重新拋出了例外。

+0

@justkt閱讀我對彼得的回答的評論 – 2010-05-06 13:43:26

+0

@知道我知道你 - 儘管我和彼得在一起。你不應該排除異常。特別是不在圖形界面出現問題的應用程序中,用戶不知道它(除非您的代碼正常完美地繼續執行該錯誤,這非常不尋常)。看到我鏈接的SO鏈接的慷慨,豐富的理由和來自社區的許多協議。 – justkt 2010-05-06 13:45:13

+0

@justkt但我沒有下沉這個例外。我趕上了它,並通知用戶發生了什麼事。如果我不會做那些會下沉的事情。 – 2010-05-06 18:07:49

5

編譯器在調用你對這個正確的。 根據Java grammar,catch子句的「參數」必須同時具有類型和變量標識符。如果省略,程序文本不再是語法上正確的Java程序。

CatchClause:趕上(FormalParameter )塊

FormalParameter:[最後]類型 VariableDeclaratorId

至於爲什麼事情是這樣 - 我認爲這是容易解析,並允許這裏的選項不提供任何東西。通過使用異常對象對錯誤做出反應是非常普遍的,所以典型的情況是有一個變量,而不是忽略它。由於沒有額外的性能成本,他們可能只是讓你不使用它。根據我的經驗,如果你沒有引用catch塊中的異常對象,沒有IDE警告你一個未使用的變量。

1

簡化其他答案 - 我認爲 - 當你捕捉到一個異常時,你需要真正抓住一些東西,並且指定將會發生什麼。這不是「如果出現問題就執行此代碼」,它是「如果這個特定的事情出錯了,請執行此代碼」。

最佳做法是登錄或重新拋出;如果你正在捕捉一個異常,那麼而不是你想要登錄或重新拋出的東西,你是否真的需要去捕捉它,或者你能否以另一種方式做到這一點?

+0

@Dean我絕對不能同意你的看法。這是我決定如何處理異常,如果我不想這樣做,我應該能夠這樣做。我不認爲創建一個未使用的變量也是一種好的做法。 – 2010-05-06 18:15:19

相關問題