1.Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用崭孤?
? ? ? ? 異常是指Java程序運(yùn)行時(shí)(非編譯)所發(fā)生的非正常情況或錯(cuò)誤惜姐,與現(xiàn)實(shí)生活中的事件很相似沛膳,現(xiàn)實(shí)生活中的事件可以包含事件發(fā)生的時(shí)間褐鸥,地點(diǎn)腰鬼,人物蝶棋,情節(jié)等信息卸亮,可以用一個(gè)對(duì)象來(lái)表示,Java使用面向?qū)ο蟮姆绞絹?lái)處理異常玩裙,它把程序中發(fā)生的每一個(gè)異常也都分別封裝到一個(gè)對(duì)象來(lái)表示的兼贸,該對(duì)象中包含有異常的信息。Java.lang.throwable吃溅,throwable下面又派生出兩個(gè)子類:error和exception溶诞。
? ? error表示應(yīng)用程序本身無(wú)法克服和恢復(fù)的一種嚴(yán)重問(wèn)題,程序只有死的份了决侈,例如螺垢,內(nèi)存溢出和線程死鎖等系統(tǒng)問(wèn)題。
? ? ?exception表示程序還能夠克服和恢復(fù)的問(wèn)題赖歌,其中又分為系統(tǒng)異常和普通異常枉圃,系統(tǒng)異常是軟件是軟件本身缺陷所致的問(wèn)題,也就是軟件開發(fā)人員考慮不周所致的問(wèn)題庐冯,軟件使用者無(wú)法克服和恢復(fù)這種問(wèn)題孽亲,但在這種問(wèn)題下還可以讓軟件系統(tǒng)繼續(xù)運(yùn)行或者讓軟件死掉,例如肄扎,數(shù)組腳本越界(arrayindexoutofboundsexception),空指針異常(nullpointrexception)墨林,類型轉(zhuǎn)換異常(classcastexception);普通異常是運(yùn)行環(huán)境的變化或異常所導(dǎo)致的問(wèn)題,是用戶能夠克服的問(wèn)題犯祠,例如旭等,網(wǎng)絡(luò)斷線,硬盤空間不夠衡载,發(fā)生這樣的異常后搔耕,程序不應(yīng)該死掉。
Java為系統(tǒng)異常和普通異常提供了不同的解決方案痰娱,編譯器強(qiáng)制普通異常必須try.......catch處理或用throws聲明繼續(xù)拋給上層調(diào)用方法處理弃榨,所以普通異常也稱為checked異常,而系統(tǒng)異常也可以處理梨睁,也可以不處理鲸睛,所以編譯器不強(qiáng)制用try....catch處理或用throws聲明,所以系統(tǒng)異常也稱為unchecked異常坡贺。
注:出現(xiàn)系統(tǒng)異常后官辈,系統(tǒng)會(huì)把異常一直往上層拋箱舞,一直遇到處理代碼,如果沒(méi)有遇到處理到最上層拳亿,如果是多線程就由thread.run()拋出晴股,如果是單線程就被main()拋出。若是線程肺魁,線程結(jié)束电湘,若是主程序,程序退出鹅经。
2.最常見的運(yùn)行異常寂呛?
arrayindexoutofboundsexception? ? ?數(shù)組腳本越界? ? ? ? ? ? ? ? ? ? ? ? ? ??nullpointrexception? ? ? ?空指針異常
classcastexception? ? ? ? ? ? ? ? ? ? ? ? ? ?類型轉(zhuǎn)換異常? ? ? ? ? ? ? ? ? ? ? ? ? ? arithmeticexception? ? ? ? 算術(shù)條件異常
classnotfoundexception? ? ? ? ? ? ? ? ? ? ?指定的類不存在
3.Java語(yǔ)言如何進(jìn)行異常處理,關(guān)鍵字:throws,throw,try,catch,finally分別代表什么意義瞬雹?在try塊可以拋出異常嗎昧谊?
throws是獲取并向外拋出異常
throw是拋出異常
try是將會(huì)發(fā)生異常的語(yǔ)句括起來(lái)刽虹,從而進(jìn)行異常的處理酗捌,
catch是如果有異常就會(huì)執(zhí)行他里面的語(yǔ)句,
try...catch是內(nèi)部捕獲異常并做自定義處理
而finally不論是否有異常都會(huì)進(jìn)行執(zhí)行的語(yǔ)句涌哲。
*? 如果要捕捉throw拋出的異常胖缤,則必須使用try—catch語(yǔ)句》Щ可見哪廓,throw可以主動(dòng)拋出異常,也就是可以在try中拋出異常
throw和throws的詳細(xì)區(qū)別如下:
throw是語(yǔ)句拋出一個(gè)異常初烘。
語(yǔ)法:throw (異常對(duì)象);
throw e;
throws是方法可能拋出異常的聲明涡真。(用在聲明方法時(shí),表示該方法可能要拋出異常)
語(yǔ)法:[(修飾符)](返回值類型)(方法名)([參數(shù)列表])[throws(異常類)]{......}
public void doA(int a) throws Exception1,Exception3{......}
1. 區(qū)別
throws是用來(lái)聲明一個(gè)方法可能拋出的所有異常信息肾筐,而throw則是指拋出的一個(gè)具體的異常類型哆料。此外throws是將異常聲明但是不處理,而是將異常往上傳吗铐,誰(shuí)調(diào)用我就交給誰(shuí)處理东亦。
2.分別介紹
? throws:用于聲明異常,例如唬渗,如果一個(gè)方法里面不想有任何的異常處理典阵,則在沒(méi)有任何代碼進(jìn)行異常處理的時(shí)候,必須對(duì)這個(gè)方法進(jìn)行聲明有可能產(chǎn)生的所有異常(其實(shí)就是镊逝,不想自己處理壮啊,那就交給別人吧,告訴別人我會(huì)出現(xiàn)什么異常撑蒜,報(bào)自己的錯(cuò)歹啼,讓別人處理去吧)充坑。
格式是:方法名(參數(shù))throws 異常類1,異常類2染突,.....
throw語(yǔ)句用在方法體內(nèi)捻爷,表示拋出異常,由方法體內(nèi)的語(yǔ)句處理份企。
throws語(yǔ)句用在方法聲明后面也榄,表示再拋出異常,由該方法的調(diào)用者來(lái)處理司志。
throws主要是聲明這個(gè)方法會(huì)拋出這種類型的異常甜紫,使它的調(diào)用者知道要捕獲這個(gè)異常。
throw是具體向外拋異常的動(dòng)作骂远,所以它是拋出一個(gè)異常實(shí)例囚霸。
throws說(shuō)明你有那個(gè)可能,傾向激才。
throw的話拓型,那就是你把那個(gè)傾向變成真實(shí)的了。
同時(shí):
a瘸恼、throws出現(xiàn)在方法函數(shù)頭劣挫;而throw出現(xiàn)在函數(shù)體。
b东帅、throws表示出現(xiàn)異常的一種可能性压固,并不一定會(huì)發(fā)生這些異常;throw則是拋出了異常靠闭,執(zhí)行throw則一定拋出了某種異常帐我。
c、兩者都是消極處理異常的方式(這里的消極并不是說(shuō)這種方式不好)愧膀,只是拋出或者可能拋出異常拦键,但是不會(huì)由函數(shù)去處理異常,真正的處理異常由函數(shù)的上層調(diào)用處理扇调。
4.sleep()和wait()有什么區(qū)別矿咕?
sleep就是正在執(zhí)行的線程主動(dòng)讓出cup,cpu去執(zhí)行其他線程狼钮,在sleep指定的時(shí)間后碳柱,cup才會(huì)回到這個(gè)線程上繼續(xù)往下執(zhí)行,如果當(dāng)前線程進(jìn)入了同步鎖熬芜,sleep方法并不會(huì)釋放鎖莲镣,即使當(dāng)前線程使用sleep方法讓出了cup,但其他被同步鎖擋住了的線程也無(wú)法得到執(zhí)行。wait是指在一個(gè)已經(jīng)進(jìn)入了同步鎖的線程內(nèi)涎拉,讓自己暫時(shí)讓出同步鎖瑞侮,以便其他正在等待此鎖的線程可以得到同步鎖并運(yùn)行的圆,只有其他線程調(diào)用了notify方法(notify并不釋放鎖,只是告訴調(diào)用過(guò)wait方法的線程可以參與獲得鎖的競(jìng)爭(zhēng)了半火,但不是馬上得到鎖越妈,因?yàn)殒i還在別人手中,別人還沒(méi)有釋放钮糖。如果notify方法后面的代碼還有很多梅掠,需要這些代碼執(zhí)行完后才會(huì)釋放鎖,可以在notify方法后增加一個(gè)等待和一些代碼店归,看效果)調(diào)用wait方法的線程就會(huì)解除wait狀態(tài)和程序可以再次得到鎖后繼續(xù)向下運(yùn)行阎抒。
5.多線程有幾種實(shí)現(xiàn)方法?同步有幾種實(shí)現(xiàn)方法消痛?
多線程有兩種實(shí)現(xiàn)方法且叁,分別是繼承thread類和實(shí)現(xiàn)runnable 接口
同步的實(shí)現(xiàn)方式有兩種synchronized,wait,與notify
wait():使一個(gè)線程處于等待狀態(tài),并且釋放所持有的對(duì)象的lock秩伞。
sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài)逞带,是一個(gè)靜態(tài)方法,調(diào)用此方法要捕捉InterruptedException(中斷異常)異常稠歉。
notify()掰担;喚醒一個(gè)處于等待狀態(tài)的線程汇陆,注意的是在調(diào)用此方法的時(shí)候怒炸,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由jvm確定喚醒那個(gè)線程毡代,而不是按優(yōu)先級(jí)阅羹。
Allnotity():喚醒所有處于等待狀態(tài)的線程,注意并不是給所有喚醒線程一個(gè)對(duì)象的鎖教寂,而是讓他們競(jìng)爭(zhēng)捏鱼。
6.啟動(dòng)一個(gè)線程是用run()還是start()?
啟動(dòng)一個(gè)線程是調(diào)用start()方法酪耕,使線程就緒狀態(tài)导梆,以后可以被調(diào)度為運(yùn)行狀態(tài),一個(gè)線程必須關(guān)聯(lián)一些具體的執(zhí)行代碼迂烁,run()方法是該線程所關(guān)聯(lián)的執(zhí)行代碼
7.介紹collection框架的結(jié)構(gòu)看尼?
集合框架(Collection?Framework)泛指java.util包的若干個(gè)類和接口.如Collection,List,ArrayList,LinkedList,Vector(自動(dòng)增長(zhǎng)數(shù)組),HashSet,HashMap等.??
集合框架中的類主要封裝的是典型的數(shù)據(jù)結(jié)構(gòu),如動(dòng)態(tài)數(shù)組,鏈表,堆棧,集合,哈希表等.??
集合框架類似編程中經(jīng)常用到的工具類,使得編碼這專注于業(yè)務(wù)層的實(shí)現(xiàn),不需要從底層實(shí)現(xiàn)相關(guān)細(xì)節(jié)—“數(shù)據(jù)結(jié)構(gòu)的封裝”和”典型算法的實(shí)現(xiàn)”.??
Java.util.collection是一個(gè)集合接口。它提供了對(duì)集合對(duì)象進(jìn)行基本操作的通用接口方法盟步。collection接口在Java類庫(kù)中有很多具體的實(shí)現(xiàn)藏斩。collection 接口的意義是為各種具體的集合提供了最大化的統(tǒng)一操作方式。
8.collection和collections的區(qū)別却盘?
Collection是集合類的上級(jí)接口狰域,繼承與他的接口主要有Set?和List.??
Collections是針對(duì)集合類的一個(gè)幫助類媳拴,它包含有各種有關(guān)集合操作的靜態(tài)多態(tài)方法,此類不能實(shí)例兆览,就像一個(gè)工具類屈溉,服務(wù)于Java的collection框架
9.collection框架中要實(shí)現(xiàn)什么接口?
Comparable/comparator
10.arraylist和vector的區(qū)別
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?list? ?(實(shí)現(xiàn))*有序可重復(fù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? vector:線程安全但速度慢抬探,在jdk1.2后已經(jīng)被arraylist取代语婴,底層是數(shù)組結(jié)構(gòu),元素個(gè)數(shù)超過(guò)容量驶睦,增長(zhǎng)1倍
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arraylist:線程不安全查詢速度快砰左,底層是數(shù)組結(jié)構(gòu)。元素個(gè)數(shù)超過(guò)容量场航,增長(zhǎng)0.5倍
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? linkedlist:線程不安全缠导,增刪數(shù)度快,底層是鏈表式結(jié)構(gòu)? ? ? ? ??
collection(繼承)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?set? ?(實(shí)現(xiàn))*無(wú)序不重復(fù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hashset:線程安全溉痢,存取速度快
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? treeset:線程不安全僻造,元素以二叉樹的形式排列
11.hashmap和hashtable的區(qū)別?
同:它們都實(shí)現(xiàn)了map接口
異:a.hashmap允許空(null)鍵值(key)孩饼,由于非線程安全髓削,在只有一個(gè)線程訪問(wèn)的情況下效率要高于hashtable;
? ? ? ? b.hashmap允許將null作為一個(gè)entry的key或者value镀娶,而hashtable不允許
? ? ? ? c.最大的不同是立膛,hashtable的方法是synchrionize的,而hashMap不是梯码,在多個(gè)線程訪問(wèn)hashtable時(shí)宝泵,不需要自己為它的方法實(shí)現(xiàn)同步,而
hashmap就必須為之提供外同步轩娶。
總結(jié):
歷史原因:hashtable是基于陳舊的dictionary 類的儿奶,hashmap是Java1.2引進(jìn)的map接口的一個(gè)實(shí)現(xiàn)。
同步性:hashtable是線程安全的鳄抒,也就是說(shuō)是同步的闯捎,而hashmap是線程不安全的,不是同步的三值许溅;只有hashmap可以讓你將空值作為一個(gè)表的key或alue
Map(實(shí)現(xiàn))
hashtable:線程安全瓤鼻,鏈表結(jié)構(gòu),查找慢闹司,增刪快娱仔。且key與value不能為null,
hashmap:線程不安全游桩,數(shù)組結(jié)構(gòu)牲迫,查找塊耐朴,增刪慢。允許將null作為一個(gè)entry的key或者value