成人视屏在线观看-国产99精品-国产精品1区2区-欧美一级在线观看-国产一区二区日韩-色九九九

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

Java catch與throw同時(shí)使用的操作

瀏覽:10日期:2022-08-16 11:42:09
一、應(yīng)用背景

在實(shí)際應(yīng)用中,處理異常往往需要更加復(fù)雜的處理——當(dāng)一個(gè)異常出現(xiàn)時(shí),單靠某個(gè)方法無(wú)法完全處理該異常,必須由幾個(gè)方法協(xié)作才能完全處理該異常,也就是說(shuō),在異常出現(xiàn)的當(dāng)前方法中,程序只能對(duì)異常進(jìn)行部分處理,還有些處理需要在方法的調(diào)用者中才能完成,所以應(yīng)該再次拋出異常,讓該方法的調(diào)用者也能捕獲到異常。

為了實(shí)現(xiàn)這種通過(guò)多個(gè)方法協(xié)作處理同一異常的情形,可以catch塊中結(jié)合throw語(yǔ)句來(lái)完成。

二、應(yīng)用舉例1 代碼示例

AuctionTest.java

public class AuctionTest{private double initPrice = 30.0;// 因?yàn)樵摲椒ㄖ酗@式拋出了AuctionException異常,// 所以此處需要聲明拋出AuctionException異常public void bid(String bidPrice)throws AuctionException{double d = 0.0;try{d = Double.parseDouble(bidPrice);}catch (Exception e){// 此處完成本方法中可以對(duì)異常執(zhí)行的修復(fù)處理,// 此處僅僅是在控制臺(tái)打印異常跟蹤棧信息。e.printStackTrace();// 再次拋出自定義異常throw new AuctionException('競(jìng)拍價(jià)必須是數(shù)值,'+ '不能包含其他字符!');}if (initPrice > d){throw new AuctionException('競(jìng)拍價(jià)比起拍價(jià)低,'+ '不允許競(jìng)拍!');}initPrice = d;}public static void main(String[] args){AuctionTest at = new AuctionTest();try{at.bid('df');}catch (AuctionException ae){// 再次捕捉到bid方法中的異常。并對(duì)該異常進(jìn)行處理System.err.println(ae.getMessage());}}}

AuctionException.java

public class AuctionException extends Exception{ // 無(wú)參數(shù)的構(gòu)造器 public AuctionException(){} //① // 帶一個(gè)字符串參數(shù)的構(gòu)造器 public AuctionException(String msg) //② { super(msg); }}2 運(yùn)行結(jié)果

java.lang.NumberFormatException: For input string: 'df' at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224) at java.lang.Double.parseDouble(Double.java:510) at AuctionTest.bid(AuctionTest.java:16) at AuctionTest.main(AuctionTest.java:39)

競(jìng)拍價(jià)必須是數(shù)值,不能包含其他字符!

3 結(jié)果說(shuō)明

上面程序bid對(duì)應(yīng)catch塊捕獲到異常后,系統(tǒng)打印了該異常的跟蹤棧信息,接著拋出一個(gè)AuctionException異常,通知該方法調(diào)用者再次處理AuctionException異常。

所有程序中的main方法,也就是bid方法調(diào)用者再次捕獲AuctionException異常并將該異常詳細(xì)描述信息輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出。

補(bǔ)充:Java try-catch、throw和throws的幾點(diǎn)想法

以前寫代碼,很少用到異常,后來(lái)發(fā)現(xiàn)這種習(xí)慣是錯(cuò)的。異常也是一種信息,并不是錯(cuò)誤。

1:先寫個(gè)簡(jiǎn)單的類:

package com.exception.demo;public class Main { public static void main(String[] args) { Main main = new Main(); } public void methodTry() { } public void methodThrow() { }}

初始環(huán)境就是這么簡(jiǎn)答。

2:下面給方法methodTry加上方法主體:

public static void main(String[] args) { Main main = new Main(); main.methodTry(); } public void methodTry() { int a=10; int b=0; int c=a/b; }

剛開(kāi)始學(xué)代碼的時(shí)候都會(huì)寫這個(gè)方法,會(huì)拋出一個(gè)異常:

Java catch與throw同時(shí)使用的操作

控制臺(tái)很清楚的告訴我們,被除數(shù)不能為0.但是如果我們想自己獲取這個(gè)異常,然后做些操作呢?比如說(shuō) 如果這個(gè)方法體有問(wèn)題,我就做一個(gè)輸出。

public void methodTry() { try { int a=10; int b=0; int c=a/b; System.out.println(c); } catch (Exception e) { System.out.println('這個(gè)方法體有問(wèn)題:'+e.getMessage()); } }

這個(gè)時(shí)候就用到了try-catch,手動(dòng)的捕獲這個(gè)異常,然后進(jìn)行我們需要的操作。畢竟異常分很多種,并不是所有的異常都是我們不需要的。

比如說(shuō)對(duì)用戶登錄來(lái)說(shuō),登錄成功 登錄失敗兩種結(jié)果,登錄失敗又分為重復(fù)登錄,賬號(hào)密碼不匹配等。

我們可以把這些失敗全都寫成Exception。當(dāng)成功的時(shí)候就直接返回,失敗的時(shí)候拋出異常,這個(gè)可比我們寫好多返回值簡(jiǎn)單多了。

接著說(shuō)try-catch

Java catch與throw同時(shí)使用的操作

我們手動(dòng)的捕獲了這個(gè)異常。上面的代碼告訴我們,當(dāng)try-catch塊中有異常時(shí),異常后面的代碼是不會(huì)執(zhí)行的。try-catch還有什么好處?回滾。

3:throw

public static void main(String[] args) { Main main = new Main(); main.methodThrow(); } public void methodThrow() { throw new Exception('這里有異常'); }

其實(shí)當(dāng)我簡(jiǎn)單的拋出個(gè)異常的時(shí)候,throw new Exception()這里會(huì)報(bào)錯(cuò),現(xiàn)在看一個(gè)報(bào)錯(cuò)信息:

Java catch與throw同時(shí)使用的操作

顯示讓我們選擇是throws 還是try-catch。

我們寫好的throw是什么意思呢? 其實(shí)跟a/0是一個(gè)意思,都是拋出一個(gè)異常,只不過(guò)一個(gè)是jdk已經(jīng)定義好的異常,被除數(shù)不能為0.一個(gè)是我們手動(dòng)拋出的異常。

先用try-catch試試看

public void methodThrow() { try { throw new Exception('這里有異常'); } catch (Exception e) { System.out.println('MethodThrow:'+e.getMessage()); } }

Java catch與throw同時(shí)使用的操作

重點(diǎn)在于手動(dòng)拋出異常后,我們要在catch中進(jìn)行處理,在catch中寫我們的部門邏輯代碼。

4:throws

剛才我們選擇的是try-catch,現(xiàn)在選擇throws

public static void main(String[] args) throws Exception { Main main = new Main(); main.methodThrow(); } public void methodThrow() throws Exception { throw new Exception('這里有異常'); }

方法methodThrow throws Exception之后,他的父類就面臨著兩種情況,要么try-catch 要么throws這個(gè)異常。這種情況跟methodThrow中手動(dòng)拋出異常遇到的問(wèn)題是一樣的。

看來(lái)可以這么理解:

throw是手動(dòng)拋出異常,跟 被除數(shù)不能為0 數(shù)組下標(biāo)越界等異常一樣,都是異常。

try-catch是在catch中手動(dòng)捕獲異常,然后進(jìn)行一些操作。比如說(shuō)輸出異常信息,打印錯(cuò)誤日志等。

throws是往上級(jí)拋出異常,我的方法methodThrow有異常,但是在這個(gè)方法中我不進(jìn)行處理了,讓上級(jí)進(jìn)行處理吧。然后就跑到main函數(shù)那去了。

對(duì)main函數(shù)來(lái)說(shuō),可以throws讓系統(tǒng)進(jìn)行處理,也可以自己處理這個(gè)異常啊。

main.methodThrow()和a/0 、throw new Execption()沒(méi)什么區(qū)別,都是有異常。

其實(shí)可以整體的寫:

public static void main(String[] args){ Main main = new Main(); try { main.methodThrow(); } catch (Exception e) { System.out.println(e.getMessage()); } } public void methodThrow() throws Exception { throw new Exception('這里有異常'); }

方法中的異常,到main函數(shù)中再進(jìn)行處理。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 黄色国产在线观看 | 八戒午夜精品视频在线观看 | 亚洲 欧美 日韩 丝袜 另类 | 欧美在线一区二区三区 | 偷拍自拍日韩 | 成年人黄色免费网站 | 亚洲成人第一 | 久久免费播放视频 | 高清一区在线 | 午夜欧美精品久久久久久久久 | 成人网在线免费观看 | 欧美另类亚洲一区二区 | 亚洲成a人片在线观看精品 亚洲成a人片在线观看中 | 亚州中文字幕 | 久久久免费 | 国产欧美视频综合二区 | 欧美一级毛片欧美大尺度一级毛片 | 欧美成人一级 | 九九re6精品视频在线观看 | 日韩免费观看一级毛片看看 | 中国一级毛片欧美一级毛片 | 久青草免费在线视频 | 欧美猛交xxxx免费看 | 亚洲欧美日韩国产 | 免费一区二区三区久久 | 日韩精品免费一区二区 | 91精品网站 | a网在线| 色悠久 | 国产精品一级 | 国产精品久久久久久小说 | 国产欧美二区三区 | 性生活免费视频网站 | 99久久精品国产一区二区成人 | 欧美在线一区二区三区欧美 | 欧美aaa毛片免费看 欧美aaa视频 | 中文字幕一区二区三区精品 | 国产精品1区2区3区 国产精品1区2区3区在线播放 | 成年人午夜免费视频 | 亚洲视频在线观看网站 | 波多野结衣一区在线观看 |