????01-面向?qū)ο?異常-finally)
? ? ? ? 還是以之前那個(gè)程序?yàn)槔了獭N覀兓叵肫饋泶俾觯郧霸谶M(jìn)行異常處理的時(shí)候,除了try代芜、catch苔埋,是不是還有一部分叫finally呀?
? ? ? ? 我們把finally也加進(jìn)去蜒犯。?
? ? ? ? finally中存放的是一定會(huì)被執(zhí)行的代碼组橄。
? ? ? ? 測(cè)試了兩次,一次是傳錯(cuò)誤的值罚随,發(fā)生異常的情況玉工;一次是傳正確的值,沒有異常的情況淘菩,發(fā)現(xiàn)finally都執(zhí)行到啦:
? ? ? ? ?那么遵班,有一個(gè)問題屠升,程序發(fā)生異常了,這兩句話都會(huì)執(zhí)行到:
????????那這兩句話有什么區(qū)別嗎狭郑?
? ? ? ? 我們來做一個(gè)小測(cè)試腹暖,在程序發(fā)生異常的時(shí)候,我們希望程序在這里結(jié)束翰萨,不要往下執(zhí)行了脏答, 加一句return語句:
? ? ? ? 運(yùn)行結(jié)果是這樣的:
? ? ? ? 我們發(fā)現(xiàn),"over"沒有執(zhí)行亩鬼,而“finally”依然執(zhí)行了殖告。return代表著結(jié)束這個(gè)主函數(shù),而“over”是主函數(shù)中的語句雳锋,所以沒有被執(zhí)行黄绩。
? ? ? ? 既然finally始終都會(huì)被執(zhí)行到,那么它存在的意義是什么呢玷过?
? ? ? ? 我們來用一個(gè)實(shí)際需求來說明它存在的作用爽丹。
? ? ? ? 我們寫程序,去連接數(shù)據(jù)庫辛蚊。數(shù)據(jù)庫里存儲(chǔ)了n多的數(shù)據(jù)粤蝎,我們從主機(jī)發(fā)一個(gè)請(qǐng)求到服務(wù)器里面去,首先要做的是不是連接呀嚼隘?
? ? ? ? 連接好之后,使用完服務(wù)器里的數(shù)據(jù)袒餐,我們要及時(shí)斷開飞蛹。因?yàn)榉?wù)器的連接數(shù)是有限的,就像CPU的處理能力是有限的一樣灸眼,如果我們始終和它連接著不斷開卧檐,會(huì)耗費(fèi)服務(wù)器的資源,占用服務(wù)器的連接焰宣,害其他想使用服務(wù)器的寶寶不能及時(shí)連接上霉囚。
? ? ? ? 注意哦,不論是否成功取到服務(wù)器中的數(shù)據(jù)匕积,我們結(jié)束后都要及時(shí)斷開哦盈罐!
? ? ? ? 對(duì)數(shù)據(jù)庫的使用需要經(jīng)歷這三個(gè)過程:
? ? ? ? 但是在第二步的時(shí)候,可能會(huì)出現(xiàn)一些異常闪唆,比如要?jiǎng)h除的數(shù)據(jù)不存在啦盅粪、要添加的數(shù)據(jù)不符合規(guī)則啦這種奇奇怪怪的情況。出現(xiàn)異常之后悄蕾,程序會(huì)結(jié)束掉票顾,但是作為一個(gè)文明有愛的寶寶,我們關(guān)閉數(shù)據(jù)庫的操作也要正常進(jìn)行呢!
? ? ? ? 這個(gè)時(shí)候就需要用到finally啦奠骄,我們這樣來寫(只寫了大意豆同,省略了一些內(nèi)容):
? ? ? ? 因此,finally灰常重要含鳞!
? ? ? ? 在寫到關(guān)于異常的處理影锈,如果沒有做finally的處理,沒有進(jìn)行資源的關(guān)閉民晒,這個(gè)程序就是有問題的精居,面試官會(huì)因此認(rèn)為你缺乏編程經(jīng)驗(yàn)。后果好嚴(yán)重呀潜必。
? ? ? ? finally代碼塊:定義一定執(zhí)行的代碼靴姿。
? ? ? ? 通常用于關(guān)閉資源。
? ? ? ? 資源一定要關(guān)閉掉磁滚,否則它的運(yùn)行壓力會(huì)非常大佛吓。
? ? ? ? 再說說這個(gè)異常,我們可以把它拋出去嗎垂攘?
? ? ? ? 我們來思考一下:你在調(diào)用我的功能往數(shù)據(jù)庫里面存數(shù)據(jù)维雇,(也就是我在操作數(shù)據(jù)庫,你只要調(diào)用我就行啦)晒他。你把數(shù)據(jù)給我吱型,我把結(jié)果給你就OK。這個(gè)時(shí)候數(shù)據(jù)庫發(fā)生問題了陨仅,我把問題拋給你津滞,你能解決嗎?
? ? ? ? 你是調(diào)用我的人灼伤,你把數(shù)據(jù)給我了触徐,我來操作數(shù)據(jù)庫,現(xiàn)在數(shù)據(jù)庫發(fā)生問題了狐赡,我把數(shù)據(jù)庫異常拋給了你撞鹉,這不合適呀。因?yàn)槟阒皇悄脭?shù)據(jù)的人颖侄,你根本不懂怎么操作數(shù)據(jù)庫鸟雏,我卻把我的問題丟給了你,我很壞壞览祖!所以這樣不好的崔慧!
? ? ? ? 這樣做的問題:
? ? ? ? 1,我打破了我這個(gè)程序的封裝性穴墅,暴露出了它的內(nèi)容到別人那里去惶室。
? ? ? ? 2温自,我把我的問題丟給了你,而你不會(huì)解決皇钞。
? ? ? ? 所以悼泌,還是負(fù)責(zé)操作數(shù)據(jù)庫的我,來對(duì)數(shù)據(jù)庫異常進(jìn)行處理夹界,這才是最好的安排馆里。
? ? ? ? 這樣來寫:
? ? ? ? 先處理數(shù)據(jù)庫異常,將數(shù)據(jù)庫異常處理完之后可柿,再向外拋一個(gè)異常鸠踪,并把這個(gè)異常標(biāo)識(shí)到方法上:
? ? ? ? 而你在調(diào)用我的方法的時(shí)候,數(shù)據(jù)庫異常你處理不了复斥,但是這個(gè)異常就要交由你來處理啦营密。(數(shù)據(jù)庫異常你處理不了是正常的,但是添加的數(shù)據(jù)不符合規(guī)則等等目锭,這種問題评汰,就是你可以處理的啦)
? ? ? ? 所以開發(fā)是要分層次的,模塊化的開發(fā)痢虹,我就負(fù)責(zé)處理數(shù)據(jù)庫的功能被去,你就負(fù)責(zé)數(shù)據(jù)的部分(數(shù)據(jù)的獲取、返回之類的)奖唯,將數(shù)據(jù)獲取到惨缆,校驗(yàn)就是你的事,最終你是不是把數(shù)據(jù)要給我丰捷,我把它放到數(shù)據(jù)庫里面去坯墨,或者說,你需要什么數(shù)據(jù)跟我說瓢阴,我去數(shù)據(jù)庫里面幫你找畅蹂。
? ? ? ? 舉個(gè)例子幫助理解哦:
? ? ? ? 倉庫管理員和銷售員健无。銷售需要一批貨荣恐,賣出去,難道需要銷售親自去倉庫里面取貨嗎累贤?如果這樣做叠穆,過程就會(huì)很繁瑣。所以將銷售和倉庫分開臼膏,銷售來面向客戶硼被,需要什么貨,讓倉庫管理員去取渗磅,倉庫管理員是面向倉庫的嚷硫。
? ? ? ? 現(xiàn)在检访,銷售需要10箱貨,叫倉庫管理員去取貨仔掸。倉庫管理員到倉庫之后發(fā)現(xiàn)脆贵,昨天下大雨,倉庫漏水了起暮,把貨全都淹了卖氨,貨不能用了。這個(gè)時(shí)候负懦,倉庫管理員需要跟銷售說“倉庫漏水了筒捺,怎么辦呀?”嗎纸厉?不需要的系吭。倉庫內(nèi)部的事情祝辣,由倉庫管理員來處理逮壁。漏水的問題需要倉庫管理員來處理,這不是銷售可以處理的事抱完,他只需要告訴銷售“沒有貨哦抛猫◇№铮”就可以啦。
? ? ? ? 就像上面這兩句話:我們先對(duì)倉庫的異常問題進(jìn)行處理闺金,然后將問題報(bào)出去逾滥。但是不需要將本層的問題報(bào)出去,只報(bào)一個(gè)對(duì)方可以識(shí)別的問題就可以了败匹。
? ? ? ? 這就叫做問題的封裝寨昙。有些問題我們需要內(nèi)部進(jìn)行處理,處理完之后掀亩,我們告訴對(duì)方處理的結(jié)果就好了舔哪。至于原因,愿意說就說槽棍,不愿意說就算啦捉蚤。
? ? ? ? 那這樣可以嗎:
? ? ? ? 倉庫管理員把倉庫修好了,但是沒有告訴銷售沒有貨炼七。銷售既沒有拿到貨缆巧,也不知道發(fā)生了什么,沒有收到任何消息豌拙。
? ? ? ? 這個(gè)問題是有關(guān)聯(lián)性的陕悬,倉庫管理員卻沒有將關(guān)聯(lián)性的信息提供出去。
????????所以不可以這樣的按傅,這兩句話的內(nèi)容都要做到哦捉超。
????02-面向?qū)ο?異常-處理語句其他格式)
? ? ? ? 異常處理語句的幾種格式:
? ? ? ? 使用的時(shí)候擇其一就好啦胧卤。
? ? ? ? 說一個(gè)小問題:
? ? ? ? 這樣編譯能通過嗎?
? ? ? ? 不能哦拼岳。因?yàn)樵诤瘮?shù)內(nèi)拋灌侣,函數(shù)上要標(biāo)識(shí)呢。
? ? ? ? 那這樣寫編譯可以通過嗎:
? ? ? ? 能裂问。因?yàn)閱栴}在內(nèi)部可以解決了侧啼,外部就不知道了。原則是:只要問題可以被解決堪簿,問題就可以不聲明痊乾。問題沒有被解決,就要聲明在函數(shù)上椭更。
? ? ? ? 什么叫問題可以解決了哪审?有catch就叫問題可以解決了~(catch真好~)
? ? ? ? 再來,拋一個(gè)e虑瀑,編譯能通過嗎湿滓?
? ? ? ? 不能。
? ? ? ? 因?yàn)樽プ×艘粋€(gè)問題舌狗,又拋了一個(gè)問題叽奥。
? ? ? ? 那這樣呢,能通過嗎痛侍?
? ? ? ? 能哦朝氓。因?yàn)樗赾atch中,只要被處理了就行主届。
? ? ? ? 接著再看赵哲,這樣可以編譯通過嗎:
? ? ? ? 問題被處理了嗎?沒有catch就沒有被處理君丁。沒處理的話枫夺,就要在函數(shù)上標(biāo)識(shí)異常。這里并沒有標(biāo)識(shí)出去绘闷,所以不能編譯通過橡庞。
? ? ? ? 那這里寫finally有什么用呢?
? ? ? ? 注意簸喂,在這個(gè)功能內(nèi)部燎潮,有可能會(huì)訪問到一些其他資源纠拔,但是這個(gè)資源產(chǎn)生一些問題臀叙,并不在這個(gè)資源中處理。但是岁疼,我還是要關(guān)資源。產(chǎn)生不產(chǎn)生問題不管它扳肛,資源都要關(guān)掉绪抛。產(chǎn)生問題呢,丟給調(diào)用者去處理咕娄,這個(gè)功能不管挚歧,但是資源要先關(guān)掉痴鳄,因?yàn)閷?duì)方獲取到這個(gè)問題之后芽唇,他有可能也不會(huì)關(guān)資源。所以基显,try和finally是可以在一起的,finally可以用于關(guān)閉資源(或者說一定會(huì)執(zhí)行的代碼)琅催。
? ? ? ? 如果在一個(gè)功能當(dāng)中,定義了一些必須要執(zhí)行的代碼虫给。那么就可以用try-finally的形式藤抡,將一定要執(zhí)行的代碼放在finally當(dāng)中。
? ? ? ? 記住一點(diǎn):catch是用于處理異常抹估。如果沒有catch就代表異常沒有被處理過杰捂,如果該異常是檢測(cè)時(shí)異常,那么必須聲明棋蚌。
????03-面向?qū)ο?異常-覆蓋時(shí)的異常特點(diǎn))
? ? ? ? 注意哦嫁佳,異常聲明的時(shí)候是不是聲明在函數(shù)上呀?而函數(shù)有一個(gè)特性就叫做覆蓋谷暮。
? ? ? ? 那么蒿往,異常在子父類覆蓋中的體現(xiàn)是什么樣呢?
? ? ? ? 異常在子父類中覆蓋中的體現(xiàn):
? ? ? ? 1湿弦,子類在覆蓋父類時(shí)瓤漏,如果父類的方法拋出異常,那么子類的覆蓋方法,只能拋出父類的異呈叱洌或者該異常的子類蝶俱。
? ? ? ? 舉例:
? ? ? ? B異常是A異常的子類。
? ? ? ? 這是為什么呢饥漫?父類已經(jīng)有問題了榨呆,子類在繼承父類的時(shí)候,不能比父類還有問題庸队,只能說是和父類一樣的問題积蜻,或者是父類問題的子問題。
? ? ? ? 我們用一個(gè)例子來說明:
? ? ? ? 我們定義了一個(gè)Test類彻消,其中有一個(gè)function方法竿拆,它的function方法接收了Fu類的引用,調(diào)用了Fu類的show方法宾尚。
? ? ? ? function調(diào)用的是一個(gè)拋出異常的方法丙笋,是不是要么拋要么try呀?
? ? ? ? 我們先try一下:
? ? ? ? 然后在主函數(shù)中創(chuàng)建Test對(duì)象煌贴,調(diào)用function方法就好啦不见。
? ? ? ? 過了一段時(shí)間,來了一個(gè)Zi類崔步,寫了一個(gè)show方法把父類Fu的這個(gè)方法覆蓋掉了稳吮,他拋出的是C異常井濒。
? ? ? ? 我們現(xiàn)在調(diào)用function的時(shí)候給里面?zhèn)鱪ew Zi()(屬于多態(tài))灶似。
? ? ? ? 傳了new Zi()之后會(huì)發(fā)生什么現(xiàn)象呢?
? ? ? ? Test類中的f.show()運(yùn)行的將是Zi類的show方法瑞你,而Zi類的show方法拋出的是C異常酪惭,它能夠處理嗎?
? ? ? ? 不能處理者甲。這就叫做春感,早期的程序,不能處理后續(xù)產(chǎn)生的新異常虏缸。
? ? ? ? 所以鲫懒,不可以讓子類拋新異常,只能夠拋可以處理的異常刽辙。
? ? ? ? 如果窥岩,Zi類在覆蓋Fu類的show方法之后,真的發(fā)生了C異常宰缤,就必須在內(nèi)部處理颂翼,不能拋哦晃洒!
? ? ? ? 2,如果父類方法拋出多個(gè)異常朦乏,子類在覆蓋該方法時(shí)球及,只能拋出父類異常的子集。
? ? ? ? 3呻疹,如果父類或者接口的方法中沒有異常拋出吃引,那么子類在覆蓋方法時(shí),也不可以拋出異常诲宇。如果子類方法發(fā)生了異常际歼,就必須要進(jìn)行try處理惶翻,絕對(duì)不能拋姑蓝。
????04-面向?qū)ο?異常-練習(xí))
? ? ? ? 問題描述:
? ? ? ? 先要對(duì)這個(gè)程序進(jìn)行基本設(shè)計(jì)。
? ? ? ? 這個(gè)面積功能我們?cè)撊绾味x呢吕粗?我們發(fā)現(xiàn)纺荧,可以把面積功能先提取出來,這個(gè)面積呢颅筋,我們可以視為圖形當(dāng)中的拓展功能宙暇。(圖形可以畫出來,但不一定需要求面積议泵,所以是拓展功能)
? ? ? ? 那么占贫,我們可以把它定義成接口。
? ? ? ? 接口Shape:
? ? ? ? 長方形Rec類:
? ? ? ? 創(chuàng)建Rec對(duì)象先口,并調(diào)用getArea方法型奥。
? ? ? ? 我們傳入了負(fù)數(shù)值,這顯然不合常理:
? ? ? ? 該怎么解決呢碉京?
? ? ? ? 以前還比較青蔥的我們會(huì)這樣干:
? ? ? ? 這么做很笨笨噠~
? ? ? ? 為什么說這么做很笨笨厢汹,編譯運(yùn)行:
? ? ? ? 這樣有意義嗎?
? ? ? ? 沒有谐宙,而且它是錯(cuò)的烫葬。按理說,傳了-3和4凡蜻,這個(gè)長方形就不應(yīng)該存在搭综,更別說調(diào)用面積了,所以r.getArea()方法是不應(yīng)該運(yùn)算的划栓,這才是對(duì)的设凹。
? ? ? ? 剛剛那種笨笨方法,叫做正常流程代碼和問題處理代碼結(jié)合得非常緊密茅姜,閱讀性比較差闪朱。而且月匣,當(dāng)發(fā)生錯(cuò)誤之后,處理方法不僅僅是一個(gè)簡單的輸出語句奋姿,而是一大堆處理方法锄开,也就是會(huì)有一大堆代碼來處理這些問題。當(dāng)這些代碼都集中在一起的時(shí)候称诗,閱讀起來會(huì)非常痛苦萍悴。
? ? ? ? 那么怎么辦呢?
? ? ? ? 我們可以只保留正常流程的代碼寓免,當(dāng)異常發(fā)生的時(shí)候癣诱,我們到異常發(fā)生的位置,再去看處理代碼袜香。這是不是就方便多啦撕予?
? ? ? ? 所以,異常的產(chǎn)生可以讓正常流程代碼和異常處理代碼相分離蜈首。
? ? ? ? 我們現(xiàn)在定義一個(gè)非法值的異常:
? ? ? ? 然后將異常在這里拋出:
? ? ? ? 主函數(shù)中用try-catch語句來寫:
? ? ? ? 編譯運(yùn)行:
? ? ? ? 我們?cè)賮矸治鲆幌拢?/p>
????????如果真的出現(xiàn)了問題实抡,傳入了-3和4,長方形就沒有建立成功欢策,求面積也是沒有意義的吆寨,后面再用catch來處理,有意義嗎踩寇?沒有啄清。
? ? ? ? try-catch后面還有很多關(guān)于這個(gè)長方形的代碼,下面的處理是不是全沒有意義呀俺孙?那怎么辦呢辣卒?
? ? ? ? 讓異常繼承它,RuntimeException:
? ? ? ? 一旦發(fā)生這個(gè)問題鼠冕,我不告訴你添寺,我就讓你的程序停掉,因?yàn)閿?shù)據(jù)非法了懈费。數(shù)值都非法了计露,我還如何運(yùn)算呢?沒辦法運(yùn)算呀憎乙。而這個(gè)問題是你造成的票罐,你造成的問題已經(jīng)使得我的運(yùn)算無法繼續(xù),那我就不運(yùn)算辣泞边!我也是有脾氣的该押,哼!
? ? ? ? 這個(gè)時(shí)候阵谚,程序就被停掉蚕礼,代碼需要被修正烟具。
? ? ? ? 這就是繼承RuntimeException的原因。
? ? ? ? 這里也不需要標(biāo)識(shí)啦:
? ? ? ? 不標(biāo)識(shí)的話奠蹬,主函數(shù)中調(diào)用的時(shí)候就不需要處理了朝聋,因?yàn)樗揪筒恢罆?huì)發(fā)生問題:
? ? ? ? 此時(shí)編譯運(yùn)行,結(jié)果就靠譜啦:
? ? ? ? 程序直接結(jié)束囤躁,由虛擬機(jī)來處理冀痕。處理完告訴你,你出現(xiàn)非法值啦狸演,在29行和51行言蛇,你趕緊把這個(gè)值改掉辣!
? ? ? ? 所以就要修改代碼了宵距。
? ? ? ? 用戶在使用Rec對(duì)象的時(shí)候腊尚,就需要判斷一下,他往里面?zhèn)鞯闹当仨毐WC是符合的值才能往里面?zhèn)鳌?/p>
? ? ? ? 再寫一個(gè)圓形Circle類:
? ? ? ? 在主函數(shù)中調(diào)用:
????????編譯運(yùn)行:
? ? ? ? 我們又有一個(gè)問題消玄,那這樣寫的話跟伏,我們還寫這個(gè)自定義異常NoValueException做什么呢丢胚?
? ? ? ? 需要寫噠翩瓜,因?yàn)樽远x異常中會(huì)有我們自己的特有內(nèi)容。而且携龟,如果直接是RumtimeException異常兔跌,我們不能具體的看出是哪一個(gè)異常。如果我們能夠起一個(gè)更有意義的名字峡蟋,比如這里的NoValueException坟桅,是不是就更加方便閱讀啦?
? ? ? ? 所以蕊蝗,我們通常會(huì)起一個(gè)特有的名稱仅乓,就知道發(fā)生了什么問題啦。
? ? ? ? 這叫做對(duì)問題名稱的描述蓬戚。
? ? ? ? 所以夸楣,在這里,我們還是建議子漩,寫成NoValueException:
? ? ? ? 這樣運(yùn)行的時(shí)候拋出的就是NoValueException啦豫喧。這樣名稱會(huì)更直觀一些:
? ? ? ? 這種是RuntimeException,當(dāng)然幢泼,如果其他可以處理的對(duì)象紧显,就需要在方法上聲明,并在調(diào)用的時(shí)候?qū)憈ry-catch語句來處理缕棵。注意孵班,將正常流程寫在try中涉兽,將處理過程寫在catch中,這樣正常流程和異常處理的代碼就成功分離啦篙程,閱讀性會(huì)更好花椭。
????????以后注意啦,寫代碼的時(shí)候會(huì)經(jīng)常碰到問題房午,碰到問題怎么辦呢矿辽?用異常來描述,封裝成對(duì)象郭厌。問題也是個(gè)對(duì)象呢袋倔。
????05-面向?qū)ο?異常-總結(jié))
? ? ? ? 異常:
? ? ? ? 是什么?是對(duì)問題的描述折柠。將問題進(jìn)行對(duì)象的封裝宾娜。
? ? ? ? 異常體系:
? ? ? ? ? ? ? ? Throwable
? ? ? ? ? ? ? ? ? ? ? ? |--Error
? ? ? ? ? ? ? ? ? ? ? ? |--Exception
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |--RuntimeException
? ? ? ? 異常體系的特點(diǎn):異常體系中的所有類以及建立的對(duì)象都具備可拋性,也就是說可以被throw和throws關(guān)鍵字所操作扇售。注意前塔,只有異常體系具備這個(gè)特點(diǎn)。
? ? ? ? throw和throws的用法:
? ? ? ? throw定義在函數(shù)內(nèi)承冰,用于拋出異常對(duì)象华弓。
? ? ? ? throws定義在函數(shù)上,用于拋出異常類困乒,可以拋出多個(gè)用逗號(hào)隔開寂屏。
? ? ? ? 當(dāng)函數(shù)內(nèi)容有throw拋出異常對(duì)象,并未進(jìn)行try處理娜搂,那么必須要在函數(shù)上聲明迁霎,否則都會(huì)編譯失敗。
? ? ? ? 注意:RuntimeException異常除外百宇。也就說考廉,函數(shù)內(nèi)如果拋出的是RuntimeException異常,函數(shù)上可以不用聲明携御。
? ? ? ? 如果函數(shù)聲明了異常昌粤,調(diào)用者需要進(jìn)行處理,處理方法可以throws可以try因痛。
? ? ? ? 異常有兩種:
? ? ? ? 1婚苹,編譯時(shí)被檢測(cè)異常
? ? ? ? ? ? ? ? 該異常在編譯時(shí)如果沒有處理(沒有拋也沒有try),編譯失敗鸵膏。
? ? ? ? ? ? ? ? 該異常被標(biāo)識(shí)膊升,代表這可以被處理。
? ? ? ? 2谭企,運(yùn)行時(shí)異常(編譯時(shí)不檢測(cè))
? ? ? ? ? ? ? ? 在編譯時(shí)廓译,不需要處理评肆,編譯器不檢查。
? ? ? ? ? ? ? ? 該異常的發(fā)生非区,建議不處理瓜挽,讓程序停止。需要對(duì)代碼進(jìn)行修正征绸。
? ? ? ? 異常處理語句:?
? ? ? ? 有三種結(jié)合方式:
? ? ? ? 1久橙,try和catch:
? ? ? ? 2,try和finally:
? ? ? ? 3管怠,try淆衷、catch、finally:
? ? ? ? 注意:1.finally中定義的通常是關(guān)閉資源代碼渤弛,因?yàn)橘Y源必須釋放祝拯。
? ? ? ? 另外,注意在下面這個(gè)例子中這兩種語句的不同:
? ? ? ? ?2她肯,finally只有一種情況不會(huì)執(zhí)行佳头。當(dāng)執(zhí)行到System.exit(0);的時(shí)候,finally不會(huì)執(zhí)行晴氨。
? ? ? ? 自定義異常:
? ? ? ? ? ? ? ? 定義類繼承Exception或者RuntimeException
? ? ? ? ? ? ? ? 1康嘉,為了讓該自定義類具備可拋性
? ? ? ? ? ? ? ? 2,讓該類具備操作異常的共性方法
? ? ? ? ? ? ? ? 當(dāng)要定義自定義異常的信息時(shí)瑞筐,可以使用父類已經(jīng)定義好的功能凄鼻。
? ? ? ? ? ? ? ? 比如異常信息會(huì)傳遞給父類的構(gòu)造函數(shù):
? ? ? ? 自定義異常的好處:
? ? ? ? 自定義異常是按照J(rèn)ava的面相對(duì)象思想腊瑟,將程序中出現(xiàn)的特有問題進(jìn)行封裝聚假。
? ? ? ? 異常的好處:
? ? ? ? ? ? ? ? 1,將問題進(jìn)行封裝闰非。
? ? ? ? ? ? ? ? 2膘格,將正常流程代碼和問題處理代碼相分離,方便于閱讀财松。
? ? ? ? 異常的處理原則:
? ? ? ? ? ? ? ? 1瘪贱,處理方式有兩種:try或者throws
? ? ? ? ? ? ? ? 2,調(diào)用到拋出異常的功能時(shí)辆毡,拋出幾個(gè)菜秦,就處理幾個(gè)。
? ? ? ? ? ? ? ? ? ? ? ? 這時(shí)會(huì)出現(xiàn)一個(gè)try對(duì)應(yīng)多個(gè)catch的情況舶掖。
? ? ? ? ? ? ? ? 3球昨,多個(gè)catch,父類的catch放到最下面眨攘。
? ? ? ? ? ? ? ? 4主慰,catch內(nèi)嚣州,需要定義針對(duì)性的處理方式。不要簡單的定義printStackTrace共螺,或者輸出語句该肴。也不要不寫。(因?yàn)榈渤霈F(xiàn)問題藐不,將不會(huì)有任何的提示和日志文件保留匀哄,會(huì)導(dǎo)致這個(gè)問題就過去了)
? ? ? ? ? ? ? ? ? ? ? ? 當(dāng)捕獲到的異常,本功能處理不了時(shí)雏蛮,可以繼續(xù)在catch中拋出拱雏。
? ? ? ? ? ? ? ? ? ? ? ? 如果該異常處理不了,但并不屬于該功能出現(xiàn)的異常底扳。
? ? ? ? ? ? ? ? ? ? ? ? 可以將異常轉(zhuǎn)換后铸抑,再拋出和該功能相關(guān)的異常。
? ? ? ? ? ? ? ? ? ? ? ? 或者異持阅#可以處理鹊汛,但需要將異常產(chǎn)生的和本功能相關(guān)的問題提供出去。
? ? ? ? ? ? ? ? ? ? ? ? 當(dāng)調(diào)用者知道阱冶,并處理刁憋,也可以將捕獲異常處理后,轉(zhuǎn)換新的異常木蹬。
? ? ? ? 異常的注意事項(xiàng):
? ? ? ? ? ? ? ?在子父類覆蓋時(shí):
? ? ? ? ? ? ? ? 1至耻,子類拋出的異常必須是父類的異常的子類或者子集。
? ? ? ? ? ? ? ? 2镊叁,如果父類或者接口沒有異常拋出時(shí)尘颓,子類覆蓋出現(xiàn)異常,只能try不能拋晦譬。
????06-面向?qū)ο?練習(xí)四)
? ? ? ? 這一節(jié)將有一大串截屏疤苹,因?yàn)椴幌朐谶@些小練習(xí)題上耗費(fèi)太多時(shí)間,就先截下來敛腌,以后閑暇時(shí)間可以慢慢做著玩兒~
? ? ? ? 不想看題之間把這段劃過去就OK啦卧土。?
? ? ? ? 編譯失敗。沒有再func方法上聲明該異常像樊。應(yīng)改成:
? ? ? ? 如果func方法上聲明了該異常尤莺,結(jié)果是:B C D
? ? ? ? 考的是子類的實(shí)例化過程。
? ? ? ? 結(jié)果:Test Demo Test
? ? ? ? 編譯失斏鳌:因?yàn)锳接口中并未定義func方法颤霎,這個(gè)方法是子類特有的。
? ? ? ? A B
? ? ? ? 編譯失敗,因?yàn)锳接口中沒有定義test方法捷绑。
? ? ? ? B C 5
? ? ? ? 編譯失敗韩脑,非靜態(tài)內(nèi)部類中不可以定義靜態(tài)成員。
? ? ? ? 內(nèi)部類中如果定義了靜態(tài)成員粹污,該內(nèi)部類必須被靜態(tài)修飾段多。
? ? ? ? 4 5 showzi showzi
? ? ? ? B C D
? ? ? ? 編譯失敗殉农。因?yàn)楦道字腥鄙倏諈?shù)的構(gòu)造函數(shù)诗充。
? ? ? ? 或者子類應(yīng)該通過super語句指定要調(diào)用的父類中的構(gòu)造函數(shù)脂信。
? ? ? ? 編譯失敗失乾。因?yàn)樽宇惛割愔械膅et方法沒有覆蓋。但是子類調(diào)用的時(shí)候不能明確返回的值是什么類型韧骗。所以這樣的函數(shù)可以存在子父類中市栗。
? ? ? ? 編譯失敗鲫骗。因?yàn)榇蛴 癆”的輸出語句執(zhí)行不到沈贝。
? ? ? ? 記赘苋恕:throw單獨(dú)存在,下面不要定義語句宋下,因?yàn)閳?zhí)行不到嗡善。
? ? ? ? 編譯失敗。多個(gè)catch時(shí)学歧,父類的catch要放在下面罩引。
? ? ? ? 134 13423
? ? ? ? 4