2011-08-31 42 views
9

我嘗試讓我的代碼在沒有錯誤且沒有警告的情況下編譯爲標準實踐。但有一個煩人的警告,我知道如何在.NET中處理,而不是在Java中處理。說我有一個代碼塊這樣的:Java中的捕獲塊變量警告

try { 
     FileInputStream in = new FileInputStream(filename); 
     return new Scanner(in).useDelimiter("\\A").next(); 
    } catch (FileNotFoundException ex) { 
     LOG.log(Level.SEVERE, "Unable to load file: {0}", filename); 
     return null; 
    } 

我得到的變量ex不使用警告。現在,我並沒有使用ex,我不想ex,但我不知道該怎麼辦。在.NET中我可以這樣做:

catch (FileNotFoundException) 

沒有變量,它會編譯和運行沒有錯誤。

在Java中如何處理這種情況?我知道我可以創建一個局部變量並將其設置爲ex,但這似乎是一個愚蠢而浪費的解決方法,可以修復一個並非真正需要的警告。

+1

它在許多語言說的太容易了,我不明白這一點例外,所以我會忽略它。 Java採取保姆的方式告訴你這是一個值得處理的異常。 –

回答

6

有沒有乾淨的方式在Java中「標記ex使用的」,除非使用它。

但請注意,根據its documentation一個FileNotFoundException也可以扔掉時「[...]文件確實存在,但由於某種原因無法訪問,例如,當試圖打開一個只讀的寫作文件「。

因此,我建議你使用例外也打印異常的消息。

我知道這並不回答一般問題,但我幾乎想不出一個例外,當它發生時,我至少不會記錄的某些信息。

+0

我將此標記爲最佳答案,因爲它在第一句中直接回答了我的問題。 – Sheridan

+0

「也通過打印來自異常的消息」這是使用異常文本('toString()')作爲用戶界面項目。我會說這是一個糟糕的主意:文本沒有國際化,並且通常是面向程序員而不是用戶的表單。 – Raedwald

+0

關於是否應該使用異常消息的更多想法:http://stackoverflow.com/questions/7320080/should-you-report-the-message-text-of-exceptions – Raedwald

11

登錄異常。無論如何,追逐一個bug總是有用的。

+1

我同意:知道文件未找到的原因總是有用的。您可以將罰款或最佳級別的例外記錄下來。 – Matteo

+3

非常贊同,請你自己幫忙'LOG.log(Level.SEVERE,「無法加載文件:」+ filename,ex);'。 –

+0

他記錄異常。他的問題是來自編譯器的虛假警告消息。 – Raedwald

1

如果我用javac的代碼,我沒有得到一個警告,所以無論您使用的是不同的編譯器,或者不同的設置 - 我認爲一個IDE使用與未使用的變量特殊設置。之前在管線@SuppressWarnings ("unused")

在Eclipse我把這種警告面向行了與註釋,在這種情況下。

+0

他沒有得到一個錯誤,他得到了一個警告。 – Paul

+0

你說得對,我糾正了它,因爲在命令行上,我沒有收到警告。我被他的句子搞糊塗了'在.NET中,我可以這麼做:... catch(FileNotFoundException)...沒有變量,它會編譯並運行,沒有錯誤。「但在其他地方,他清楚地談論警告。 –

0

您應該記錄異常。根據FileInputStream API,可以拋出FileNotFoundException「如果該文件不存在,是目錄而不是常規文件,或者出於某種其他原因無法打開以供閱讀」。如果你遇到這個問題,在你的日誌文件中有更多的細節(比如堆棧跟蹤)會使修復更容易。

2

警告是IDE的警告,你應該能夠將其關閉。

但是,有很多原因可以引發FileNotFoundException,因此在此情況下您會想知道原因。

IntelliJ將0​​或ignored識別爲故意忽略的異常或非空catch塊,視您的設置而定。

3

基本上,你是SOL(你必須聲明變量並且吸取警告),因爲JAVA有點狂躁抑鬱,或者至少是保姆,在它的開發方法中;這是又一個例子。即使你從不打算使用它,JAVA也會讓你聲明catch變量。這意味着你有一個未使用的變量躺在等待導致問題。雖然有很多關於「你需要處理這個異常變量」的評論,但這些評論卻錯過了這個問題的要點。問題是「我怎樣才能得到這個未使用的變量警告」,該示例使用FileNotFound異常,但它可能是任何異常。問題不是關於FileNotFound異常,而是關於未使用的變量警告。

該問題的異常類型無關緊要。例如,我有一個管理數據緩衝區的類。它可以拋出異常的原因有幾個,其中之一是數據緩衝區已滿。所以,如果我嘗試將數據放入完整緩衝區,我的函數可能會收到該異常。這是它在這種情況下唯一可以接受的例外。我有一個使用這個類的函數檢測異常並擴展緩衝區。它不關心異常變量,它不記錄異常,處理異常並繼續前進。除了例外,我可以返回一個標誌,指示緩衝區已滿,但是打敗了異常處理系統(系統中有其他例程,這個例外是一個錯誤,我用日誌和消息處理它們給用戶等)

所以,我可以設置IDE忽略未使用的變量警告。但這不是一個好主意,因爲有時候不使用變量表示真正的問題(我錯過了一段代碼,或者我忘記了結束塊註釋或其他東西)。或者,至少我有一段未使用的代碼可能會增加未來的混亂。我可以壓制這個警告,但那只是一個混亂。底線是我必須放入一個未使用的變量,記錄它爲什麼沒有被使用,並且爲了壓制警告(所以QA並沒有抱怨),所有這些都是因爲JAVA想要保護我免於自己。

<rant> 

這是我用JAVA遇到的一個主要問題。 JAVA聲稱他們是認真的專業人員嚴肅的項目使用的嚴肅的編程語言。然而,他們認爲這些同樣嚴肅的專業人員總是犯下愚蠢的錯誤,他們需要從這些錯誤中得到保護。這幾乎就像告訴外科醫生他們不能使用手術刀,因爲他們可以切割自己。如果你正在爲業餘愛好者製作玩具編程語言,那麼你需要加入所有的保護措施。但是,如果你聲稱爲專業人士製作語言,那就給專業人員提供他們工作所需的工具。他們是專業人員,給他們專業的工具。像強迫定義一個未使用的變量,不允許操作符超載,沒有未簽名的基元,基本上將用戶類視爲二等公民限制了工具集,並指出專業工程師並不全是專業人士的觀點。我不介意警告 - 它們幫助開發過程更快。我不喜歡缺乏完整的工具集。這會導致周圍的工作,錯誤,以及全新的錯誤來源。

不管怎樣,遺憾的咆哮

</rant>