黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java中處理異常的6個最佳實踐

Java中處理異常的6個最佳實踐

更新時間:2019-09-13 09:00:00 來源:動力節(jié)點 瀏覽2373次

 

  Java中的異常處理不是一個簡單的主題。初學者發(fā)現(xiàn)它很難理解,甚至有經(jīng)驗的開發(fā)者也可以花幾個小時討論如何以及應該拋出或處理哪些異常。下面動力節(jié)點Java培訓機構小編為大家分享通過實踐了解如何處理Java異常。


    1、在finally塊中清理資源或使用Try-With-Resource語句


  在try塊中使用資源是很頻繁的,比如InputStream,之后需要關閉它。這些情況中的一個常見錯誤是在try塊結束時關閉資源。


public void doNotCloseResourceInTry() {

 FileInputStream inputStream = null;

 try {

 File file = new File("./tmp.txt");

 inputStream = new FileInputStream(file);

 // use the inputStream to read a file

 // do NOT do this

 inputStream.close();

 } catch (FileNotFoundException e) {

 log.error(e);

 } catch (IOException e) {

 log.error(e);

 }

}


  問題是只要沒有拋出異常,這種方法似乎完全正常。try塊中的所有語句都將被執(zhí)行,資源將被關閉。


  但是你添加了try塊是有原因的。你調用一個或多個可能拋出異常的方法,或者你自己拋出異常。這意味著你可能無法到達try塊的末尾。因此,你將不會關閉資源。


  因此,你應該將所有清理代碼放入finally塊或使用try-with-resource語句。



  使用Finally塊


  與try塊的最后幾行相比,finally塊始終執(zhí)行。這可以在成功執(zhí)行try塊之后或在catch塊中處理異常之后發(fā)生。因此,你可以確保清理所有已打開的資源。


public void closeResourceInFinally() {

 FileInputStream inputStream = null;

 try {

 File file = new File("./tmp.txt");

 inputStream = new FileInputStream(file);

 // use the inputStream to read a file

 } catch (FileNotFoundException e) {

 log.error(e);

 } finally {

 if (inputStream != null) {

 try {

 inputStream.close();

 } catch (IOException e) {

 log.error(e);

 }

 }

 }

}



  Java 7的Try-With-Resource


  另一種選擇是try-with-resource語句


  如果資源實現(xiàn)AutoCloseable接口,則可以使用它。這就是大多數(shù)Java標準資源所做的事情。當你在try子句中打開資源時,它將在try塊執(zhí)行后自動關閉,或者處理異常。


public void automaticallyCloseResource() {

 File file = new File("./tmp.txt");

 try (FileInputStream inputStream = new FileInputStream(file);) {

 // use the inputStream to read a file

 } catch (FileNotFoundException e) {

 log.error(e);

 } catch (IOException e) {

 log.error(e);

 }

}



2、特定異常


  拋出的異常越具體越好。請記住,不明白你代碼的同事,或者你可能在幾個月后需要調用你的方法并處理異常。


  因此,請務必提供盡可能多的信息。這使你的API更易于理解。因此,你的方法的調用者將能夠更好地處理異?;蛲ㄟ^額外的檢查來避免它。


  因此,總是嘗試找到最適合你的異常事件的類,例如拋出NumberFormatException而不是IllegalArgumentException。并避免拋出非特定的異常。


public void doNotDoThis() throws Exception {

 ...

}

public void doThis() throws NumberFormatException {

 ...

}



3、記錄你聲明的異常


  無論何時在方法簽名中指定異常,都應該在Javadoc中記錄它。這與以前的最佳實踐具有相同的目標:為調用者提供盡可能多的信息,以便他可以避免或處理異常。


  因此,請確保向Javadoc 添加@throws聲明并描述可能導致異常的情況。


/**

 * This method does something extremely useful ...

 *

 * @param input

 * @throws MyBusinessException if ... happens

 */

public void doSomething(String input) throws MyBusinessException {

 ...

}



4、使用描述信息拋出異常


這種最佳實踐背后的想法類似于前兩種實踐。但是這次,你不向調用方提供有關方法的信息。每個必須了解在日志文件或監(jiān)視工具中拋出異常時發(fā)生了什么的人都會讀取異常的消息。


因此,它應該盡可能準確地描述問題,并提供最相關的信息來理解異常事件。


如果拋出一個特定的異常,它的類名很可能已經(jīng)描述了那種錯誤。因此,你無需提供大量其他信息。一個很好的例子是NumberFormatException。它會被類java.lang.Long的構造函數(shù)拋出,當你以錯誤的格式提供String參數(shù)。


try {

 new Long("xyz");

} catch (NumberFormatException e) {

 log.error(e);

}


  NumberFormatException類的名稱已經(jīng)告訴你問題的類型。它的消息只需要提供導致問題的輸入字符串。如果異常類的名稱不具有表現(xiàn)力,則需要在消息中提供所需的信息。


  17:17:26,386 ERROR TestExceptionHandling:52 - java.lang.NumberFormatException: For input string: "xyz"



  5、優(yōu)先捕獲最具體的異常


  大多數(shù)IDE都可以幫助你實現(xiàn)這一最佳實踐。當你嘗試首先捕獲不太具體的異常時,它們提示無法訪問的代碼塊。


  問題是只有匹配異常的第一個catch塊才會被執(zhí)行。因此,如果首先捕獲IllegalArgumentException,則永遠不會到達應該處理更具體的NumberFormatException的catch塊,因為它是IllegalArgumentException的子類。


  始終優(yōu)先捕獲最具體的異常類,并將不太具體的catch塊添加到列表的末尾。


  你可以在以下代碼段中看到此類try-catch語句的示例。第一個catch塊處理所有的NumberFormatException,第二個處理所有不是NumberFormatException的IllegalArgumentException 異常。


public void catchMostSpecificExceptionFirst() {

 try {

 doSomething("A message");

 } catch (NumberFormatException e) {

 log.error(e);

 } catch (IllegalArgumentException e) {

 log.error(e)

 }

}

 


  6、在沒有消費的情況下包裝異常


  有時候捕獲標準異常并將其包裝成自定義異常會更好。此類異常的典型示例是應用程序或框架特定的業(yè)務異常。這允許你添加其他信息,還可以為異常類實現(xiàn)特殊處理。


  執(zhí)行此操作時,請確保將原始異常設置為cause。該異常類提供了接受一個特定的構造方法的Throwable作為參數(shù)。否則,你將丟失原始異常的堆棧跟蹤和消息,這將導致難以分析導致異常的異常事件。


public void wrapException(String input) throws MyBusinessException {

 try {

 // do something

 } catch (NumberFormatException e) {

 throw new MyBusinessException("A message that describes the error.", e);

 }

}


  總結


  正如所看到的,當你拋出或捕獲異常時,你應該考慮許多不同的事情。其中大多數(shù)都旨在提高代碼的可讀性或API的可用性。


  異常通常同時是錯誤處理機制和通信媒介。因此,您應該確保與同事討論要應用的最佳實踐和規(guī)則,以便每個人都能理解通用概念并以相同的方式使用它們。


以上就是動力節(jié)點Java培訓機構小編介紹的“Java中處理異常的6個最佳實踐”的內(nèi)容,希望對大家有幫助,更多Java最新資訊請繼續(xù)關注動力節(jié)點Java培訓機構官網(wǎng),每天會有精彩內(nèi)容分享與你。


相關免費視頻教程推薦


java初級入門教程下載——異常概述:http://www.ilovecolors.com.cn/xiazai/2559.html


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 免费毛片a线观看 | 国产成人精品视频一区 | 91短视频黄 | 曰批全过程免费视频网址 | 一区二区三区在线播放 | 欧美性猛交xxxx免费看蜜桃 | 最近中文字幕免费在线看 | 亚洲一区无码中文字幕 | 国产精品久久久久久网站 | 日本欧美一区二区三区视频麻豆 | 激情网五月天 | 欧美日韩大片在线观看 | 欧美18性欧美丶黑吊 | 露脸国产自产拍在线观看 | 毛片在线免费观看网站 | 在线观看黄的网站 | 青青网在线视频 | 午夜插插 | 日韩黄色片在线观看 | 日韩欧美一及在线播放 | 精品国产一区二区三区不卡在线 | 日日干天天| 亚洲成人免费观看 | 老司机亚洲精品影院 | 日韩第八页 | 最近中文字幕免费4 | 婷婷日韩| 日韩第四页| 亚洲一区在线免费观看 | a级精品国产片在线观看 | 久久综合九色综合欧美狠狠 | 亚洲丰满熟妇毛片在线播放 | 我不卡伦理 | a级黄色毛片免费播放视频 a级黄色毛片 | 日韩欧美在线第一页 | 日本大片久久久高清免费看 | 久久久久亚洲日日精品 | 国产高清精品一级毛片 | 国产成人亚洲精品影院 | 国产欧美亚洲精品第二区首页 | 午夜影院日韩 |