netbeans7.4_NetBeans 7.4 Beta提示警告无效的异常处理
netbeans7.4
有許多例子說明Java異常處理可能比首次出現時要困難得多,Josh Bloch專門將一整章的《 Effective Java》 (兩個版本)專門用于異常處理。 Java中的檢查異常模型 仍然 “ 有爭議” 。 我很高興看到我最近下載的NetBeans 7.4 beta有一些提示,至少可以幫助您處理Java異常處理的一些細微差別。
我最近下載了NetBeans 7.4 Beta,并在筆記本電腦上安裝了此最新版本的NetBeans 。 我下載了“所有”的NetBeans IDE下載包(包括GlassFish Server開源版4.0 , Apache Tomcat 7.0.41和Groovy支持)并將其安裝在我的計算機上。
NetBeans的“當前開發版本”中“可能的錯誤”類別中的兩個新提示是“'最終'塊抑制異?!焙汀?#39;拋出'在'最終'塊中”。 在此博客文章中,我將演示這些提示并簡要討論為什么這些提示有助于改善異常處理。
'finally'塊抑制異常
正如James Stauffer的 “ 不要在finally子句中返回 ”之類的帖子中所記錄的,以及在Java的try-finally返回設計問題之類的論壇中所記錄的那樣,通常都認為從finally塊中返回方法是一個壞主意。 接下來顯示這種不良Java編碼實踐的示例。
最終阻止異常的示例
private void throwException() throws Exception {throw new Exception("A checked exception!"); }/*** Demonstrate NetBeans hint "The 'return' statement in the 'finally' block* discards unhandled exceptions" by returning a value from the "finally"* block.* * @return Integer value that is really meaningless in this case.* @throws RuntimeException This exception is always thrown.*/ public int demonstrateReturnFromFinallyBlock() {int value = 5;try{value = 7;throwException();}catch (Exception exception){throw new RuntimeException(exception);}finally{return value;} }當執行上述代碼片段中的方法demonstrateReturnFromFinallyBlock()時,輸出如下所示:
返回值:7
盡管可能有人期望demonstrateReturnFromFinallyBlock()方法拋出運行時異常,而不是返回7的整數值(因為該方法的Javadoc甚至做廣告!),但實際上由于“ return”語句中的return語句,實際上丟棄了“始終拋出”異常。 finally擋住了。 這是一個潛在的令人討厭的問題,可能僅在運行時而不是在編譯時顯而易見。 幸運的是,NetBeans 7.4 beta包含有關此潛在問題的提示,如以下屏幕快照所示:
上面的屏幕快照演示了NetBeans 7.4 beta通過用黃色下劃線在“ finally塊中警告return語句的情況。 它還顯示,當將鼠標懸停在帶有黃色下劃線的代碼上時,NetBeans編輯器將提示“ finally”塊中的“ return”語句將丟棄未處理的異常。”
通過將-Xlint:finally傳遞給javac編譯器,也可以找到相同的條件。 顯然,這可以在命令行上完成,就像我以前在javac的-Xlint Options中 javac.compilerargs=-Xlint:finally的一樣,但是下一個屏幕快照顯示了通過-Xlint:finally規范在NetBeans中所做的相同操作-Xlint:finally通過project.properties設置javac.compilerargs=-Xlint:finally 。
在“最終”塊內“拋出”
從finally塊內部引發異常通常是一個壞主意,因為它將隱藏在該finally塊的關聯try塊中引發的任何異常。 下一個代碼清單顯示了這種錯誤形式的示例。
/*** Demonstrate NetBeans hint warning that throwing an exception from a* 'finally' block is a bad idea because it hides the original exception.*/ public void demonstrateThrowFromFinallyBlock() {Integer twoDividedByZero = null;try{twoDividedByZero = 2 / 0;}finally{if (twoDividedByZero == null){throw new RuntimeException("Cannot calculate quotient with division.");}} }有人可能會認為執行上述方法會導致引發ArithmeticException異常,而當引發更一般的(和父項) RuntimeException異常時,可能會感到有些驚訝。
下一個屏幕快照顯示此情況的NetBeans 7.4 beta警告。
將鼠標懸停在帶有黃色下劃線的代碼上會導致顯示NetBeans警告:“'finally'塊中的'throw'語句可能會隱藏原始異常?!?上面的屏幕快照顯示,這正是在這種情況下發生的事情: ArithmeticException及其堆棧跟蹤已被從finally塊拋出的RuntimeException隱藏。
如果我注釋掉從finally塊引發異常的行,則原始異常將再次可用。 下一個屏幕快照對此進行了演示。
即使啟用-Xlint:all (或僅啟用-Xlint )也不會警告從finally塊引發異常的不良形式。 在此特定示例中, -Xlint:devzero (或-Xlint:all或-Xlint )將顯示代碼中被零除,但通常不存在-Xlint警告,要求javac從中拋出時發出警告finally塊隱藏了原始異常。 這使該特定的NetBeans提示特別有用。
結論
Java異常處理中有許多細微差別和特殊情況。 NetBeans 7.4 Beta引入了兩個新的“可能的錯誤”提示,警告與異常相關的finally塊中的危險做法。 這兩種情況特別隱蔽,因為它們通常不會被編譯器捕獲(盡管可以選擇將其作為警告捕獲),直到運行時才被發現,并且不太可能通過閱讀和查看代碼來發現。
翻譯自: https://www.javacodegeeks.com/2013/09/netbeans-7-4-beta-hints-warn-of-ineffective-exception-handling.html
netbeans7.4
總結
以上是生活随笔為你收集整理的netbeans7.4_NetBeans 7.4 Beta提示警告无效的异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 妹妹英语怎么读 妹妹英语是什么
- 下一篇: 金刚结寓意 金刚结寓意是什么