Java拋出異常與自定義異常類應(yīng)用示例
本文實(shí)例講述了Java拋出異常與自定義異常類。分享給大家供大家參考,具體如下:
異常處理常用方法:
常用的異常處理方法有:
- 一、try()catch() 語(yǔ)句
- 二、throw / throws 語(yǔ)句
- 三、自定義異常類
用途:
眾所周知,當(dāng)程序運(yùn)行過(guò)程中,如果遇到了錯(cuò)誤(比如數(shù)組下標(biāo)越界,空指針等)程序就會(huì)自動(dòng)終止,但這種錯(cuò)誤一般是偶然的,可能是用戶輸入不呵呵程序編寫者的意圖導(dǎo)致,而不是程序本身問(wèn)題,這是我們要做的,是讓操作者知道發(fā)生了什么事情,而不是直截了當(dāng)?shù)慕Y(jié)束程序,這時(shí)我們就用到了異常處理(語(yǔ)句發(fā)生錯(cuò)誤時(shí),只拋出異常,而不結(jié)束程序)。
這里一源碼為例 詳細(xì)介紹一下:
一、try()catch() 語(yǔ)句:
原理剖析:
將可能發(fā)生異常的語(yǔ)句放在 tr() 中,運(yùn)行到try這一行時(shí),如果無(wú)異常,則正常執(zhí)行 try() 中語(yǔ)句,執(zhí)行完 try() 內(nèi)語(yǔ)句之后,程序自動(dòng)跳過(guò) catch() 語(yǔ)句,去執(zhí)行 catch() 之后的語(yǔ)句。
反之,如果在執(zhí)行 try() 內(nèi)語(yǔ)句時(shí),出現(xiàn)異常情況,則執(zhí)行跳轉(zhuǎn)到catch()語(yǔ)句中,進(jìn)行異常處理,一處處以之后不再回到try的()內(nèi),而是結(jié)束try()catch()內(nèi)的所有操作,去運(yùn)行后面的catch語(yǔ)句后面的語(yǔ)句。
舉個(gè)例子就明白了:
public class ClassText { public static void main(String[] args) { int textArray[] = new int[3];//用于測(cè)試數(shù)組越界異常的數(shù)組 int j;//用來(lái)使數(shù)組月結(jié)的下標(biāo) try { for ( j = 0; j < (textArray.length + 1); j++) {//有+1可見 該測(cè)試一定越界 textArray[j] = (int) Math.random()*10 ; } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } System.out.println("但是上面拋出異常后\n程序并沒有直接結(jié)束\n" + "而是跳出try()catch()語(yǔ)句\n正常執(zhí)行本條輸出語(yǔ)句"); } }
輸出如下:
可以看到,發(fā)生異常后依然執(zhí)行了后面的輸出語(yǔ)句。
二、throw / throws 語(yǔ)句
很多出初學(xué)者一直把throw / throws 語(yǔ)句,看作兩種不同的異常處理方法,其實(shí)他們可以看作一個(gè)整體,throw語(yǔ)句可以看作異常的處理語(yǔ)句,而throws我們則可以將其類比為‘extends' 它的主要作用是聲明該方法(體內(nèi)存在throw語(yǔ)句的方法,需要throws或者說(shuō)我們可以看作需要‘繼承/鏈接',該異常類型的原型),舉個(gè)例子大家就明白了:
private static void textThrow_Throws(int radius) throws Exception { if ( radius < 0 ) {//如果半徑小于0 則不符合常理進(jìn)行異常處理 throw new Exception(); } }
這樣一來(lái)throw/throws 的用法就顯而易見了。
但是在寫完throw/throws 語(yǔ)句后,異常處理并沒有結(jié)束,因?yàn)檫@里只是簡(jiǎn)單聲明了,我的這個(gè)成員方法中的可能會(huì)拋出異常,并沒有寫具體該如何處理這個(gè)異常,所以這是在主函數(shù)中,就要用try()catch()將他們包圍。描述好具體的處理異常方法:完整測(cè)試代碼如下:
public class ClassText { public static void main(String[] args) { int radius ;//定義一個(gè)叫做搬進(jìn)的變量作為測(cè)試 radius = -5;//常理可知半徑使正數(shù) try { textThrow_Throws(radius); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("程序正常結(jié)束~"); } private static void textThrow_Throws(int radius) throws Exception { if ( radius < 0 ) {//如果半徑小于0 則不符合常理進(jìn)行異常處理 throw new Exception(); } } }
我們?cè)倏纯摧敵龇独?/p>
三、自定義異常類
自定義異常類是逃不開,也是新手接觸最少的,其實(shí)它的基本使用方法還是很簡(jiǎn)單的,自定義異常處理類,只包括兩部分:(1)、類的構(gòu)造方法,構(gòu)造方法的建立則非常簡(jiǎn)單,其實(shí)只要繼承父類(比如 Exception類 )的構(gòu)造方法即可。(2)、重寫toString()函數(shù),這是最重要的一點(diǎn),再toString函數(shù)中,描述具體發(fā)生了什么錯(cuò)誤導(dǎo)致了異常的拋出。這樣一來(lái)用戶才知道究竟是發(fā)生了什么錯(cuò)誤
這里結(jié)合throw/throws 舉個(gè)例子就很好明白了:
1.首先自定義一個(gè)異常類:
public class ArrayIndexException extends Exception{ public ArrayIndexException() { // TODO Auto-generated constructor stub super(); } @Override public String toString() { // TODO Auto-generated method stub return"程序發(fā)生了越界異常! 請(qǐng)檢查下標(biāo)變化!"; } }
如上所示就是一個(gè)最基本的自定義異常類 ,它繼承了Exception 并且重寫了構(gòu)造方法以及toString方法
2.現(xiàn)在我們嘗試再主函數(shù)中調(diào)用它
public class ClassText { public static void main(String[] args) { int textArray[] = new int[3];//用于測(cè)試數(shù)組越界異常的數(shù)組 try { textSetArray(textArray);//調(diào)用下方數(shù)組賦值方法 } catch (ArrayIndexException e) { // TODO: handle exception e.printStackTrace();//如果發(fā)生了異常 則拋出自定義數(shù)組越界異常 } System.out.println("go on !"); for(int j = 0 ; j < textArray.length ; j++ ) System.out.print(textArray[j] + "\t");//再越界之前的數(shù)成功賦值 } private static void textSetArray(int[] textArray) throws ArrayIndexException{ for ( int j = 0; j < (textArray.length + 1); j++) {//有+1可見 該測(cè)試一定越界 textArray[j] = 5 ;//給數(shù)組原屬賦值 } } }
如上所示,如果發(fā)生了異常,這才catch()語(yǔ)句中聲稱自定義的異常對(duì)象,并輸出具體信息:
java異常的處理大概就這些類型,如果有疑問(wèn)可以給我留言我再完善。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
SpringBoot?整合?ElasticSearch操作各種高級(jí)查詢搜索
這篇文章主要介紹了SpringBoot?整合?ES?進(jìn)行各種高級(jí)查詢搜索的實(shí)踐記錄,本文主要圍繞?SpringBoot?整合?ElasticSearch?進(jìn)行各種高級(jí)查詢的介紹,需要的朋友可以參考下2022-06-06GateWay路由規(guī)則與動(dòng)態(tài)路由詳細(xì)介紹
這篇文章主要介紹了GateWay路由規(guī)則與GateWay動(dòng)態(tài)路由,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Netty分布式ByteBuf中PooledByteBufAllocator剖析
這篇文章主要為大家介紹了Netty分布式ByteBuf剖析PooledByteBufAllocator簡(jiǎn)述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03SpringMVC接收復(fù)雜集合對(duì)象(參數(shù))代碼示例
這篇文章主要介紹了SpringMVC接收復(fù)雜集合對(duì)象(參數(shù))代碼示例,舉接收List<String>、List<User>、List<Map<String,Object>>、User[]、User(bean里面包含List)幾種較為復(fù)雜的集合參數(shù),具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11Java數(shù)據(jù)結(jié)構(gòu)超詳細(xì)分析二叉搜索樹
二叉搜索樹是以一棵二叉樹來(lái)組織的。每個(gè)節(jié)點(diǎn)是一個(gè)對(duì)象,包含的屬性有l(wèi)eft,right,p和key,其中,left指向該節(jié)點(diǎn)的左孩子,right指向該節(jié)點(diǎn)的右孩子,p指向該節(jié)點(diǎn)的父節(jié)點(diǎn),key是它的值2022-03-03