最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Java筆記--遞歸、異常

2023-11-01 21:04 作者:爪哇島江戶川  | 我要投稿

一、遞歸

方法直接或間接的調(diào)用自身。

注意事項:遞歸如果沒有控制好終止,會出現(xiàn)遞歸死循環(huán),導(dǎo)致棧內(nèi)存溢出現(xiàn)象。

一些算法題的實現(xiàn),都需要使用遞歸。

我們來做一個小案例:假設(shè)我們要求出5的階乘,我們可以自定義一個方法去求階乘,然后用方法去調(diào)用方法。

這段代碼在棧內(nèi)存中是這樣的:

return是把結(jié)果返回給調(diào)用者的。


二、異常

異常:指的是程序在編譯或執(zhí)行過程中,出現(xiàn)的非正常的情況

例如我們之前遇到的索引越界異常、類型轉(zhuǎn)換異常、空指針異常等。

Java中所有的異常都是類。

異常的體系結(jié)構(gòu):

我們主要來了解Exception

<1>RuntimeException 運行時異常

編譯通過了,但是運行報錯了,例如10/0編譯不會報錯,但是運行時會報錯。

<2>除了RuntimeException之外的其它異常

編譯時出現(xiàn)問題,例如int age = Integer.parseInt(sc.next());這串代碼是將字符串類型轉(zhuǎn)為int類型的,加入我們輸入的是12可以正常賦值,但如果輸入abc,程序?qū)霈F(xiàn)異常。

三、異常處理的兩種方式

(1)默認(rèn)的處理方式:向上拋出

我們在現(xiàn)在故意寫了一個會出現(xiàn)異常的代碼,然后去運行它。

我們可以看到程序首先打印了一個開始,然后出現(xiàn)異常,報錯信息從下往上看,在第9行出現(xiàn)了異常,我們在第9行調(diào)用了method方法,再往上看,第14行出現(xiàn)了異常,而第14行就是方法中我們用10/0的代碼。再繼續(xù)往上看,異常信息是ArithmeticException。我們前面說過,Java中的異常都是類,類是可以用來new對象的。

當(dāng)我們第十四行出現(xiàn)異常時,Java會自動幫我們創(chuàng)建一個異常對象的,new ArithmeticException( );

就好比程序中現(xiàn)在有一顆雷,這顆雷在Java中的默認(rèn)處理方式就是向上拋出,上指的就是上一級或者說調(diào)用者。在method方法中出現(xiàn)的問題,誰調(diào)的method方法,main方法,誰掉的main方法,JVM,誰調(diào)用的JVM,程序員,所以Java將異常的位置、原因都在控制臺給程序員展示出來,然后強制將我們的程序關(guān)閉。


(2)兩種異常處理方式:

<1>try...catch捕獲異常

我們用一個例題來理解try...catch捕獲異常是怎么處理的

程序跑起來之后,創(chuàng)建了一個運算異常的對象,然后被catch捕獲了

假如我們同時有多個異常,可以多幾個catch來處理

可能有人就會覺得,如果我們在編寫代碼的時候,同時出現(xiàn)了很多個異常,難道要同時寫很多個catch嗎?

其實我們可以只用一個catch,然后在后面的括號里寫Exception,因為Exception是編譯時異常和運行時異常的父類,這樣就可以捕獲所有的異常。

但是這種捕獲異常的方式只能用同一個處理方案,而多個catch可以精準(zhǔn)捕獲使用不同的處理方案。

<2>throws拋出異常

假如我們寫一個方法將日期格式化,在調(diào)用parse方法時可能會出現(xiàn)異常,我們前面提到過,如果代碼中可能會出現(xiàn)異常,我們得在運行之前給它一個處理方案。

當(dāng)我們使用ALT+回車后選擇拋出異常處理方式后,發(fā)現(xiàn)方法名后面多了一句代碼throws ParseException。throws是異常的聲明,說明這個方法中可能存在異常,parseException是異常的類型。

當(dāng)我們在主方法中調(diào)用method方法的時候,還是會報錯,因為method方法中已經(jīng)聲明了可能會出現(xiàn)異常,這個問題我們要不要在main方法中處理?如果我們繼續(xù)選擇throws拋出異常,main方法后面也會多出一個同樣的聲明throws ParseException,然后我們運行試試看是如何處理的:

我們發(fā)現(xiàn)還是會將異常信息打印在控制臺上然后強制終止程序的運行。其實這種方式并沒有將異常處理掉,只是起到了聲明作用。

同樣的,如果出現(xiàn)了多個異常的話,也可以選擇直接聲明異常的父類。

(3)兩種異常的處理方式該如何選擇?

創(chuàng)建一個學(xué)生類,定義年齡,然后提供set方法,如果有人來調(diào)用set方法輸入年齡時時,輸入了錯誤的數(shù),例如-23,我們應(yīng)該將問題暴露給調(diào)用者。

我們可以直接創(chuàng)建一個異常對象,就像制造一個炸彈一樣,當(dāng)調(diào)用者傳入了錯誤的數(shù)據(jù),我們應(yīng)該將異常拋出,將炸彈直接扔給他,讓他去處理。throw拋出異常 new Exception是創(chuàng)建異常對象。

我們可以看到代碼依舊是會報錯的,因為我們還得聲明一下我們這個代碼中可能會出現(xiàn)異常,所以需要在set方法后面聲明可能會出現(xiàn)的異常。

然后我們回到main方法中,調(diào)用set方法的地方依舊會報錯,因為前面我們聲明了一個可能出現(xiàn)的異常,并且將之拋給了調(diào)用者,所以main方法中就接到了這個炸彈,所以我們有兩種處理方式,要么拋出異常,要么就try...catch捕獲異常,如果我們拋出異常,運行代碼還是展示出錯誤信息,所以我們選擇捕獲異常,然后我們再添加一句catch。

當(dāng)setage出現(xiàn)異常的時候,下面的catch就會將異常捕獲,格式有錯的異常會被上面的catch攔截,范圍有錯的異常會被下面的catch攔截,直到age成功賦值走到break才跳出循環(huán)。


四、自定義異常

在上面的例子中,雖然我們成功將異常捕獲但是我們在catch中異常用的是exception類,這個類范圍太大了,不能做到精準(zhǔn)捕獲,但是異常類中又沒有我們需要的類,這個時候我們就可以自定義異常類然后讓它去繼承父類。

但是,還要往類里面加入構(gòu)造方法,一般只需要一個空參的和一個帶String字符串的構(gòu)造方法。

所以我們在學(xué)生類中應(yīng)該扔出的炸彈是我們自定義的炸彈,我的意思是將異常類改為我們自定義的類。


Java筆記--遞歸、異常的評論 (共 條)

分享到微博請遵守國家法律
阳江市| 琼海市| 瓦房店市| 岢岚县| 钦州市| 澄城县| 大田县| 太仆寺旗| 赤壁市| 镇远县| 龙江县| 临安市| 宝兴县| 灯塔市| 龙门县| 兰考县| 平湖市| 唐河县| 台南市| 德州市| 仪征市| 浦江县| 周口市| 龙岩市| 沐川县| 阿鲁科尔沁旗| 南雄市| 米易县| 肃北| 白朗县| 益阳市| 区。| 柳州市| 佛山市| 郓城县| 万宁市| 米泉市| 商河县| 达州市| 敦化市| 长顺县|