电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java 編程中十個(gè)處理異常的建議

瀏覽:40日期:2022-08-28 11:50:27

一、盡量不要使用e.printStackTrace(),而是使用log打印。

反例:

try{ // do what you want }catch(Exception e){ e.printStackTrace();}

正例:

try{ // do what you want }catch(Exception e){ log.info('你的程序有異常啦,{}',e);}

理由:

printStackTrace()打印出的堆棧日志跟業(yè)務(wù)代碼日志是交錯(cuò)混合在一起的,排查異常日志不太方便。 e.printStackTrace()語(yǔ)句產(chǎn)生的字符串記錄的是堆棧信息,如果信息太長(zhǎng)太多,字符串常量池所在的內(nèi)存塊沒(méi)有空間了,即內(nèi)存滿了,那么,用戶的請(qǐng)求就卡住啦~

二、catch了異常,但是沒(méi)有打印出具體的exception,無(wú)法更好定位問(wèn)題

反例:

try{ // do what you want }catch(Exception e){ log.info('你的程序有異常啦');}

正例:

try{ // do what you want }catch(Exception e){ log.info('你的程序有異常啦,{}',e);}

理由:

反例中,并沒(méi)有把exception出來(lái),到時(shí)候排查問(wèn)題就不好查了啦,到底是SQl寫(xiě)錯(cuò)的異常還是IO異常,還是其他呢?所以應(yīng)該把exception打印到日志中哦~

三、不要用一個(gè)Exception捕捉所有可能的異常

反例:

public void test(){ try{ //…拋出 IOException 的代碼調(diào)用 //…拋出 SQLException 的代碼調(diào)用 }catch(Exception e){ //用基類 Exception 捕捉的所有可能的異常,如果多個(gè)層次都這樣捕捉,會(huì)丟失原始異常的有效信息哦 log.info(“Exception in test,exception:{}”, e); }}

正例:

public void test(){ try{ //…拋出 IOException 的代碼調(diào)用 //…拋出 SQLException 的代碼調(diào)用 }catch(IOException e){ //僅僅捕捉 IOException log.info(“IOException in test,exception:{}”, e); }catch(SQLException e){ //僅僅捕捉 SQLException log.info(“SQLException in test,exception:{}”, e); }}

理由:

用基類 Exception 捕捉的所有可能的異常,如果多個(gè)層次都這樣捕捉,會(huì)丟失原始異常的有效信息哦

四、記得使用finally關(guān)閉流資源或者直接使用try-with-resource

反例:

FileInputStream fdIn = null;try { fdIn = new FileInputStream(new File('/jay.txt')); //在這里關(guān)閉流資源?有沒(méi)有問(wèn)題呢?如果發(fā)生異常了呢? fdIn.close();} catch (FileNotFoundException e) { log.error(e);} catch (IOException e) { log.error(e);}

正例1:

需要使用finally關(guān)閉流資源,如下

FileInputStream fdIn = null;try { fdIn = new FileInputStream(new File('/jay.txt'));} catch (FileNotFoundException e) { log.error(e);} catch (IOException e) { log.error(e);}finally { try { if (fdIn != null) { fdIn.close(); } } catch (IOException e) { log.error(e); }}

正例2:

當(dāng)然,也可以使用JDK7的新特性try-with-resource來(lái)處理,它是Java7提供的一個(gè)新功能,它用于自動(dòng)資源管理。

資源是指在程序用完了之后必須要關(guān)閉的對(duì)象。 try-with-resources保證了每個(gè)聲明了的資源在語(yǔ)句結(jié)束的時(shí)候會(huì)被關(guān)閉 什么樣的對(duì)象才能當(dāng)做資源使用呢?只要實(shí)現(xiàn)了java.lang.AutoCloseable接口或者java.io.Closeable接口的對(duì)象,都OK。

try (FileInputStream inputStream = new FileInputStream(new File('jay.txt')) { // use resources } catch (FileNotFoundException e) { log.error(e);} catch (IOException e) { log.error(e);}

理由:

如果不使用finally或者try-with-resource,當(dāng)程序發(fā)生異常,IO資源流沒(méi)關(guān)閉,那么這個(gè)IO資源就會(huì)被他一直占著,這樣別人就沒(méi)有辦法用了,這就造成資源浪費(fèi)。

五、捕獲異常與拋出異常必須是完全匹配,或者捕獲異常是拋異常的父類

反例:

//BizException 是 Exception 的子類public class BizException extends Exception {}//拋出父類Exceptionpublic static void test() throws Exception {}try { test(); //編譯錯(cuò)誤} catch (BizException e) { //捕獲異常子類是沒(méi)法匹配的哦 log.error(e);}

正例:

//拋出子類Exceptionpublic static void test() throws BizException {}try { test();} catch (Exception e) { log.error(e);}

六、捕獲到的異常,不能忽略它,至少打點(diǎn)日志吧

反例:

public static void testIgnoreException() throws Exception { try { // 搞事情 } catch (Exception e) { //一般不會(huì)有這個(gè)異常 }}

正例:

public static void testIgnoreException() { try { // 搞事情 } catch (Exception e) { //一般不會(huì)有這個(gè)異常 log.error('這個(gè)異常不應(yīng)該在這里出現(xiàn)的,{}',e); }}

理由:

雖然一個(gè)正常情況都不會(huì)發(fā)生的異常,但是如果你捕獲到它,就不要忽略呀,至少打個(gè)日志吧~

七、注意異常對(duì)你的代碼層次結(jié)構(gòu)的侵染(早發(fā)現(xiàn)早處理)

反例:

public UserInfo queryUserInfoByUserId(Long userid) throw SQLException { //根據(jù)用戶Id查詢數(shù)據(jù)庫(kù)}

正例:

public UserInfo queryUserInfoByUserId(Long userid) { try{ //根據(jù)用戶Id查詢數(shù)據(jù)庫(kù) }catch(SQLException e){ log.error('查詢數(shù)據(jù)庫(kù)異常啦,{}',e); }finally{ //關(guān)閉連接,清理資源 }}

理由:

我們的項(xiàng)目,一般都會(huì)把代碼分 Action、Service、Dao 等不同的層次結(jié)構(gòu),如果你是DAO層處理的異常,盡早處理吧,如果往上 throw SQLException,上層代碼就還是要try catch處理啦,這就污染了你的代碼~

八、自定義封裝異常,不要丟棄原始異常的信息Throwable cause

我們常常會(huì)想要在捕獲一個(gè)異常后拋出另一個(gè)異常,并且希望把原始異常的信息保存下來(lái),這被稱為異常鏈。公司的框架提供統(tǒng)一異常處理就用到異常鏈,我們自定義封裝異常,不要丟棄原始異常的信息,否則排查問(wèn)題就頭疼啦

反例:

public class TestChainException { public void readFile() throws MyException{ try { InputStream is = new FileInputStream('jay.txt'); Scanner in = new Scanner(is); while (in.hasNext()) { System.out.println(in.next()); } } catch (FileNotFoundException e) { //e 保存異常信息 throw new MyException('文件在哪里呢'); } } public void invokeReadFile() throws MyException{ try { readFile(); } catch (MyException e) { //e 保存異常信息 throw new MyException('文件找不到'); } } public static void main(String[] args) { TestChainException t = new TestChainException(); try { t.invokeReadFile(); } catch (MyException e) { e.printStackTrace(); } }}//MyException 構(gòu)造器public MyException(String message) { super(message); }

運(yùn)行結(jié)果如下,沒(méi)有了Throwable cause,不好排查是什么異常了

Java 編程中十個(gè)處理異常的建議

正例:

public class TestChainException { public void readFile() throws MyException{ try { InputStream is = new FileInputStream('jay.txt'); Scanner in = new Scanner(is); while (in.hasNext()) { System.out.println(in.next()); } } catch (FileNotFoundException e) { //e 保存異常信息 throw new MyException('文件在哪里呢', e); } } public void invokeReadFile() throws MyException{ try { readFile(); } catch (MyException e) { //e 保存異常信息 throw new MyException('文件找不到', e); } } public static void main(String[] args) { TestChainException t = new TestChainException(); try { t.invokeReadFile(); } catch (MyException e) { e.printStackTrace(); } }}//MyException 構(gòu)造器public MyException(String message, Throwable cause) { super(message, cause); }

Java 編程中十個(gè)處理異常的建議

九、運(yùn)行時(shí)異常RuntimeException ,不應(yīng)該通過(guò)catch 的方式來(lái)處理,而是先預(yù)檢查,比如:NullPointerException處理

反例:

try { obj.method() } catch (NullPointerException e) {...}

正例:

if (obj != null){ ...}

十、注意異常匹配的順序,優(yōu)先捕獲具體的異常

注意異常的匹配順序,因?yàn)橹挥械谝粋€(gè)匹配到異常的catch塊才會(huì)被執(zhí)行。如果你希望看到,是NumberFormatException異常,就拋出NumberFormatException,如果是IllegalArgumentException就拋出IllegalArgumentException。

反例:

try { doSomething('test exception');} catch (IllegalArgumentException e) { log.error(e);} catch (NumberFormatException e) { log.error(e);}

正例:

try { doSomething('test exception');} catch (NumberFormatException e) { log.error(e);} catch (IllegalArgumentException e) { log.error(e);}

理由:

因?yàn)镹umberFormatException是IllegalArgumentException 的子類,反例中,不管是哪個(gè)異常,都會(huì)匹配到IllegalArgumentException,就不會(huì)再往下執(zhí)行啦,因此不知道是否是NumberFormatException。所以需要優(yōu)先捕獲具體的異常,把NumberFormatException放前面~

在這里說(shuō)一下自己整理了一份關(guān)于java的系統(tǒng)化資料,從Javase- ssm-springcloud,包括了面試題,PDF電子書(shū),網(wǎng)上商城項(xiàng)目,個(gè)人博客項(xiàng)目,分布式項(xiàng)目等都有睜開(kāi)想學(xué)習(xí)Java或者轉(zhuǎn)行,大學(xué)生都非常實(shí)用

java交流學(xué)習(xí)資源大全文件下載加我的交流學(xué)習(xí)群,里面有學(xué)習(xí)手冊(cè),面試題,開(kāi)發(fā)工具,PDF文檔書(shū)籍教程

到此這篇關(guān)于Java 編程中十個(gè)處理異常的建議的文章就介紹到這了,更多相關(guān)Java 異常處理內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 办公室家具_板式办公家具定制厂家-FMARTS福玛仕办公家具 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | 岩棉板|岩棉复合板|聚氨酯夹芯板|岩棉夹芯板|彩钢夹芯板-江苏恒海钢结构 | 阴离子聚丙烯酰胺价格_PAM_高分子聚丙烯酰胺厂家-河南泰航净水材料有限公司 | 懂研帝_专业SCI论文润色机构_SCI投稿发表服务公司 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | pbt头梳丝_牙刷丝_尼龙毛刷丝_PP塑料纤维合成毛丝定制厂_广州明旺 | 日本SMC气缸接头-速度控制阀-日本三菱伺服电机-苏州禾力自动化科技有限公司 | 海德莱电力(HYDELEY)-无功补偿元器件生产厂家-二十年专业从事电力电容器 | 防水套管厂家_刚性防水套管_柔性防水套管_不锈钢防水套管-郑州中泰管道 | 探鸣起名网-品牌起名-英文商标起名-公司命名-企业取名包满意 | 流程管理|流程管理软件|企业流程管理|微宏科技-AlphaFlow_流程管理系统软件服务商 | 北京工业设计公司-产品外观设计-产品设计公司-千策良品工业设计 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 搜木网 - 木业全产业链交易平台,免费搜货、低价买货! | 一路商机网-品牌招商加盟优选平台-加盟店排行榜平台 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 深圳彩钢板_彩钢瓦_岩棉板_夹芯板_防火复合彩钢板_长鑫 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 高低温老化试验机-步入式/低温恒温恒湿试验机-百科 | 吨袋包装机|吨包秤|吨包机|集装袋包装机-烟台华恩科技 | 伟秀电气有限公司-10kv高低压开关柜-高低压配电柜-中置柜-充气柜-欧式箱变-高压真空断路器厂家 | 昆明化妆培训-纹绣美甲-美容美牙培训-昆明博澜培训学校 | 长沙网站建设制作「网站优化推广」-网页设计公司-速马科技官网 | pH污水传感器电极,溶解氧电极传感器-上海科蓝仪表科技有限公司 | 光伏家 - 太阳能光伏发电_分布式光伏发电_太阳能光伏网 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 彼得逊采泥器-定深式采泥器-电动土壤采样器-土壤样品风干机-常州索奥仪器制造有限公司 | 北京百度网站优化|北京网站建设公司-百谷网络科技 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 铁盒_铁罐_马口铁盒_马口铁罐_铁盒生产厂家-广州博新制罐 | 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 色谱柱-淋洗液罐-巴罗克试剂槽-巴氏吸管-5ml样品瓶-SBS液氮冻存管-上海希言科学仪器有限公司 | 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 仿真植物|仿真树|仿真花|假树|植物墙 - 广州天昆仿真植物有限公司 | 宁波普瑞思邻苯二甲酸盐检测仪,ROHS2.0检测设备,ROHS2.0测试仪厂家 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 |