java異常處理throws完成異常拋出詳解
已檢查異常拋出
對(duì)于已檢查異常(checked exceptions),編譯器強(qiáng)制要求捕獲并處理可能發(fā)生的異常,不處理就不能通過編譯。但調(diào)用的方法沒有能力處理這種異常,對(duì)于這種情況,可以在方法聲明處使用throws子句來聲明拋出異常,而是調(diào)用層次向上傳遞,誰調(diào)用這個(gè)方法,這個(gè)異常就由誰來處理。如:在service層讀取文件,如果文件不存在,則需要將文件不存在的這條信息反饋給用戶。要求在service層將此異常向上拋,用戶層調(diào)用services層獲取此條信息,反饋給用戶。示例代碼如下:
創(chuàng)建類ReadFile為業(yè)務(wù)類,該類中方法 readTxtFile需要讀取硬盤上的文件,操作文件時(shí)會(huì)拋出IOException,但業(yè)務(wù)類并不能將發(fā)生異常信息推送給前端用戶,此時(shí)將異常向上拋,延遲到調(diào)用方進(jìn)行處理。
public class ReadFile { public void readTxtFile(String filePath) throws IOException { String encoding = "GBK"; File file = new File(filePath); InputStreamReader read = new InputStreamReader( new FileInputStream(file), encoding);//考慮到編碼格式 BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; while ((lineTxt = bufferedReader.readLine()) != null) { System.out.println(lineTxt); } } }
在方法中使用throws IOException向上拋出異常,異常種類為IO操作異常。main方法為調(diào)用方,調(diào)用方通過try catch獲取異常,并將異常輸出至控制臺(tái),代碼如下
public static void main(String[] args) { ReadFile readFile = new ReadFile(); try { readFile.readTxtFile("d://temp1.txt"); } catch (IOException e) { e.printStackTrace(); System.out.println(e.toString()); } }
執(zhí)行結(jié)果如下:
自定義異常拋出
在編程過程我們會(huì)根據(jù)業(yè)務(wù)規(guī)則,將一些不符合業(yè)務(wù)規(guī)則的操作也可以定義為異常。這時(shí)我們就需要使用到自定義異常,如果在實(shí)現(xiàn)方法中無法處理這種異常,這些異常還需向上拋出。
Java 可通過繼承的方式編寫自己的異常類,自定義異常類均繼承自 Exception 類,個(gè)可完成異常類編寫。如:用戶登錄時(shí)再service層有一個(gè)方法,用戶名不存在或者密碼不正確,均為異常,這時(shí)就需要用戶自定義異常。該方法是業(yè)務(wù)層方法,無法將異常直接反饋給操作用戶,需要通過交互層(如:controller)調(diào)用該方法時(shí),捕獲此種異常并將該異常返回給前端。具體示例代碼如下:
首先定義簡(jiǎn)單的自定義異常類LoginException,代表是登錄異常類。Exception 是所有異常類的父類,該類中已經(jīng)封裝了異常信息輸出、異常發(fā)生位置描述等方法,提供復(fù)用。
LoginException類繼承異常類Exception
public class LoginException extends Exception { public LoginException(String message){ super(message); } }
編寫業(yè)務(wù)代碼Login,定義方法loginDemo,該方法拋出異常LoginException,根據(jù)業(yè)務(wù)規(guī)則拋出異常
public class Login { public void loginDemo(String userName, String psw) throws LoginException { if (!userName.equals("張三")) { throw new LoginException("用戶名錯(cuò)誤!"); } else if (!psw.equals("000000")) { throw new LoginException("密碼錯(cuò)誤!"); } System.out.println("登錄成功!"); } }
調(diào)用代碼為:
public static void loginDemo(String name,String psw){ Login login = new Login(); try { login.loginDemo(name,psw); } catch (LoginException e) { e.printStackTrace(); } }
執(zhí)行結(jié)果為
對(duì)于上述簡(jiǎn)單的異常處理,我們一般直接使用throw new Exception(""),無需定義新的異常類,代碼可以修改如下:
public class Login { public void login(String userName, String psw) throws Exception { if (!userName.equals("張三")) { throw new Exception("用戶名錯(cuò)誤!"); } else if (!psw.equals("000000")) { throw new Exception("密碼錯(cuò)誤!"); } System.out.println("登錄成功!"); } }
結(jié)論
在軟件開發(fā)的很多場(chǎng)景中,方法并不具有處理異常的能力,如在業(yè)務(wù)層代碼或取的異常,需要將異常的信息通過交互層的代碼反饋給使用者(當(dāng)然也可以通過方法返回值進(jìn)行反饋,但這種返回只能是簡(jiǎn)單的)。
異常向上拋出是指在方法中產(chǎn)生異常或獲取異常后并不做任何處理,而是將“皮球”踢給調(diào)用方,調(diào)用方繼續(xù)踢給它的下一級(jí)調(diào)用方,還是自己處理那是調(diào)用方的事情。向調(diào)用方拋出異常在方法的聲明處使用throws關(guān)鍵字,后面跟要拋出異常的類型,也可以是多種類型異常,不同的異常用逗號(hào)隔開。
如:test方法執(zhí)行時(shí)可能會(huì)拋出三種異常
public static void test(int a) throws TestAException, TestBException,TestCException{ //業(yè)務(wù)代碼 }
在向上拋出異常時(shí),通常會(huì)使用到throw,就是在一個(gè)方法的內(nèi)部,當(dāng)異常發(fā)生時(shí)拋出一個(gè)自定義的異常。
以上就是java異常處理throws完成異常拋出詳解的詳細(xì)內(nèi)容,更多關(guān)于java異常throws完成異常拋出的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring純注解配置實(shí)現(xiàn)代碼示例解析
這篇文章主要介紹了Spring純注解配置實(shí)現(xiàn)代碼示例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08netty-grpc一次DirectByteBuffer內(nèi)存泄露問題
這篇文章主要介紹了netty-grpc一次DirectByteBuffer內(nèi)存泄露問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12jfinal中stateless模式嵌入shiro驗(yàn)證的實(shí)現(xiàn)方式
這篇文章主要介紹了jfinal中stateless模式嵌入shiro驗(yàn)證,今天,我們就來嘗試一種通過攔截器來實(shí)現(xiàn)的Stateless Jfinal嵌入方式,需要的朋友可以參考下2022-06-06基于JAVA的短信驗(yàn)證碼api調(diào)用代碼實(shí)例
這篇文章主要為大家詳細(xì)介紹了基于JAVA的短信驗(yàn)證碼api調(diào)用代碼實(shí)例,感興趣的小伙伴們可以參考一下2016-05-05基于HTTP協(xié)議實(shí)現(xiàn)簡(jiǎn)單RPC框架的方法詳解
RPC全名(Remote?Procedure?Call),翻譯過來就是遠(yuǎn)程過程調(diào)用,本文將為大家介紹如何基于HTTP協(xié)議實(shí)現(xiàn)簡(jiǎn)單RPC框架,感興趣的小伙伴可以了解一下2023-06-06