一药磺、上節(jié)課回顧
異常Exception
1告组、概念:在程序運(yùn)行的時候,代碼產(chǎn)生的不正常事件癌佩,導(dǎo)致程序無法正常的繼續(xù)執(zhí)行木缝。
? ? 理解它:代碼寫的不正常便锨,跑不下去了。我碟。放案。
2、程序的執(zhí)行流程:
? ? step1:JVM創(chuàng)建主線程矫俺,調(diào)用main()吱殉,程序的入口
? ? step2:按照main中的代碼,從上向下執(zhí)行厘托。友雳。。
? ? step3:main中的內(nèi)容全部執(zhí)行完畢铅匹,程序正常結(jié)束押赊。。JVM退出
3伊群、如果在程序的執(zhí)行過程中考杉,產(chǎn)生異常了,比如除0舰始,null的對象調(diào)用方法崇棠,父類對象強(qiáng)制轉(zhuǎn)為子類類型。丸卷。枕稀。由JVM負(fù)責(zé)創(chuàng)建一個該類型的異常對象,并拋出谜嫉,從而打斷程序的執(zhí)行萎坷。
?
? ? 理解:程序不正常,導(dǎo)致執(zhí)行不下去了沐兰,通過異常對象來阻止進(jìn)一步執(zhí)行哆档。。
4住闯、異常的分類:
? ? 錯誤:Error瓜浸,系統(tǒng)級別的問題,程序解決不了比原。
? ? 異常:Exception插佛,
? ? ? ? 受檢異常:編譯器在編譯程序的時候,檢查出來的異常量窘。程序中必須處理該異常雇寇,程序才能正常的執(zhí)行。
? ? ? ? ? ? 外部因素導(dǎo)致的異常。
? ? ? ? ? ? FileNotFoundException锨侯,文件找不到異常
? ? ? ? ? ? IOException嫩海,IO操作異常
? ? ? ? ? ? SQLException,SQL操作異常
? ? ? ? ParseException识腿,解析異常
? ? ? ? ? ? 出革。。渡讼。
? ? ? ? 非受檢異常:編譯器編譯程序的時候骂束,不檢查。運(yùn)行的時候可能產(chǎn)生的異常成箫,程序中不要求一定處理展箱。也叫做運(yùn)行時異常:RuntimeException
? ? ? ? ? ? 代碼中的邏輯問題導(dǎo)致的異常
? ? ? ? ? ? ArrayIndexOfBoundsException,數(shù)組下標(biāo)越界異常
? ? ? ? ? ? StringIndexOutOfBoundsException蹬昌,字符串下標(biāo)越界異常
? ? ? ? ? ? ArithmeticException混驰,算術(shù)異常
? ? ? ? ? ? NullPointerException,空指針異常
? ? ? ? ? ? ClassCastException皂贩,類轉(zhuǎn)型失敗異常
5栖榨、異常的處理
? ? A:捕獲:將異常處理在捕獲的代碼中。
intn=10;
? ? try{
? ? ? ? //可能產(chǎn)生異常的代碼
? ? ? ? //10行:5行產(chǎn)生異常明刷,結(jié)束這個try婴栽,跳入對應(yīng)的catch中
? ? }catch(異常類型1e){
? ? ? ? //處理異常
? ? ? ? e.printStack();//打印:異常類型辈末,異常的原因愚争,哪行產(chǎn)生的。挤聘。轰枝。
? ? }catch(異常類型2e{
? ? }finally{
? ? ? ? //無論try語句中,是否產(chǎn)生異常组去,此處的代碼一定會被執(zhí)行鞍陨。
? ? ? ? //慣用于做最后的清理工作:斷開資源鏈接,刪除臨時文件从隆。诚撵。。
? ? }
? ? B:拋出:方法聲明上广料,聲明該方法不處理異常,一旦產(chǎn)生異常了幼驶,交給調(diào)用處進(jìn)行處理艾杏。
throws關(guān)鍵字:用于聲明方法拋出異常
publicstaticvoid/返回值方法名(參數(shù)列表)throws異常類型1,異常類型2...{
//方法體;
?? }
//調(diào)用處:
方法名(實(shí)參);//就要處理這個異常:可抓盅藻,可拋
JVM-->main()-->test1()-->test2()-->test3()....
編碼習(xí)慣上:
try...catch語句:try語句塊中的代碼越少越好购桑。
throws...功能方法:main()不要再throws異常了畅铭。
二、本節(jié)課內(nèi)容
2.1勃蜘、throws關(guān)鍵字
用于一個方法的對外聲明:用于表示該方法不處理異常硕噩,交由調(diào)用處進(jìn)行處理。
publicstaticvoidtest()throwsParseException{
?
}
子類重寫父類的方法時缭贡,不能拋出比父類更大的異常炉擅。
父類拋出異常,子類可以不拋出
父類拋出異常阳惹,子類可以拋出和父類一樣的或者是比父類小的異常
父類拋出異常谍失,子類不能拋出比父類更大的異常
父類沒有拋出異常,子類也不能拋出異常莹汤。
2.2快鱼、throw關(guān)鍵字
用于代碼中主動拋出一個異常對象:設(shè)計(jì)一個方法的功能的時候,根據(jù)邏輯分析纲岭,可以主動拋出一個異常對象抹竹。
代碼級別上,主動拋出一個異常對象止潮,提示調(diào)用者:產(chǎn)生問題啦窃判。。
以下是String這個類的源代碼:
publiccharcharAt(intindex) {
if((index<0)||(index>=value.length)) {
thrownewStringIndexOutOfBoundsException(index);
? ? ?? }
returnvalue[index];
?? }
【面試題】對比Exception和RuntimeException的區(qū)別沽翔。
1兢孝、Exception是最大的異常父類。RuntimeException是Exception的子類仅偎。
2跨蟹、RuntimeException是運(yùn)行時異常,程序不強(qiáng)制一定處理該類型的異常橘沥。Exception的異常窗轩,包含了受檢異常,程序中必須處理該類型的異常座咆。
【面試題】對比throws和throw的區(qū)別痢艺。
1、throws關(guān)鍵字介陶,用于表示一個方法向外聲明堤舒,該方法不處理異常,交由調(diào)用處處理這個異常哺呜。處理異常的一種方式:捕獲舌缤,拋出。
2、throw關(guān)鍵字国撵,代碼中陵吸,主動拋出一個異常對象。因?yàn)槟硞€邏輯原因介牙,主動拋出一個異常對象壮虫,打斷程序的執(zhí)行。主動拋出異常對象环础。
Collection和Collections
Array和Arrays
2.3囚似、自定義異常
了解性內(nèi)容:理論知識能夠懂。
自己定義一個類喳整,用于表示某種異常谆构。需要繼承Exception或其子類即可。
問題:不是哪個類的對象框都,都有被創(chuàng)建并拋出就能夠打斷程序的功能搬素。
自定義異常:
classMyExceptionextendsException{
? ? //提供有參構(gòu)造方法。魏保。
? ? publicMyException(Stringmsg){
? ? ? ? super(msg);//調(diào)用父類的有參構(gòu)造:提供異常的信息
? ? }
? ? publicMyException(){
? ? ? ? super();//父類的無參構(gòu)造熬尺,沒有提供異常的信息
? ? }
}
程序中主動拋出一個異常對象:
? ? /*
? ? * 設(shè)計(jì)一個方法,用于檢驗(yàn)?zāi)挲g谓罗,年齡不合法粱哼,拋出一個異常
? ? */
? ? publicstaticvoidcheckAge(intage)throwsMyException{
? ? ? ? if(age<0){
//? ? ? ? ? return;
? ? ? ? ? ? thrownewMyException("年齡不能為負(fù)數(shù)。檩咱。");
? ? ? ? }
? ? ? ? System.out.println("年齡輸入正確揭措,請繼續(xù)。刻蚯。绊含。");
? ? }
return和finally的參考資料:
https://blog.csdn.net/zoujian1993/article/details/45362931
2.4、多線程
2.4.1 生活中的多任務(wù)
生活中炊汹,有很多的場景下躬充,同時干多件事兒。比如開車:同時時候手和腳讨便。做作業(yè)同時聽課充甚。泡健身房跑步,聽音樂霸褒。伴找。。
舞臺表演:邊唱邊跳废菱。
2.4.2 windows電腦
windows電腦技矮,打開任務(wù)管理器眉反,發(fā)現(xiàn)電腦中正在執(zhí)行的程序,有多個穆役。每個程序叫就叫做一個進(jìn)程。
windows電腦可以同時執(zhí)行多個程序梳凛?那是因?yàn)镃PU太快啦耿币。。
2.4.3 并行和并發(fā)
串行:任務(wù)一個接一個做韧拒。
并行:同時在做多個任務(wù)淹接。(硬件的支持)
并發(fā):在多個任務(wù)之間快速的切換,看起來同時執(zhí)行多個任務(wù)叛溢。但是實(shí)際上塑悼,某一個事件點(diǎn),執(zhí)行1個任務(wù)楷掉。
?
宏觀并行厢蒜,微觀串行。
2.4.4 進(jìn)程
進(jìn)程:就是正在執(zhí)行的程序烹植。占用系統(tǒng)資源斑鸦。
? ? 一個程序的執(zhí)行,內(nèi)存草雕,CPU巷屿。。墩虹。
?
注意區(qū)分:電腦上安裝的軟件嘱巾。沒有跑起來,不能算進(jìn)程诫钓。
2.4.5 線程
何為線程:概念:進(jìn)程中的一個執(zhí)行路徑旬昭。
進(jìn)程:一個正在執(zhí)行的程序。
Word文檔:--->一個進(jìn)程
? ? 首字母大寫--->一個線程
? ? 檢查拼寫錯尖坤。稳懒。--->一個線程
? ? 。慢味。场梆。。
2.4.6 進(jìn)程和線程
1纯路、進(jìn)程:一個正在執(zhí)行的程序:JVM正在執(zhí)行的程序
2或油、線程:正在執(zhí)行的程序中的一條執(zhí)行路徑
3、多線程:一個進(jìn)程中驰唬,可以同時有多條線程一起執(zhí)行顶岸。
如果一個進(jìn)程沒有了腔彰,該進(jìn)程中的線程也就沒有了。
如果線程沒有了辖佣,但是進(jìn)程不一定的霹抛。
2.4.7 Java中對于多線程的支持
Java中如何實(shí)現(xiàn)多任務(wù)的?多線程
Thread類:JDK提供好的卷谈,Thread類杯拐,就是java中關(guān)于多線程的實(shí)現(xiàn)。線程的功能都封裝在了該類中世蔗。
?
要使用線程端逼,來實(shí)現(xiàn)程序的并發(fā):一個程序,同時干多件事污淋。
比如:唱歌顶滩,同時跳舞
Thread類來實(shí)現(xiàn)
Java代碼,如何創(chuàng)建一條線程寸爆?如何啟動起來礁鲁?執(zhí)行功能?
兩種創(chuàng)建線程的方式
A:創(chuàng)建線程并啟動:繼承Thread類
step1:創(chuàng)建子類赁豆,繼承Thread類救氯。
step2:重寫run(),線程體歌憨。并發(fā)執(zhí)行的內(nèi)容着憨,寫在這個方法中。
step3:啟動線程:start()
?
/*
class Cat
class Person
?
class MyException extends Exception{//異常類
?
}
class MyThread extends Thread{//線程類
?
}
*/
B:實(shí)現(xiàn)Runnable接口务嫡,創(chuàng)建線程的方式二
step1:創(chuàng)建實(shí)現(xiàn)類甲抖,實(shí)現(xiàn)Runnable接口
step2:重寫run(),線程體心铃。并發(fā)執(zhí)行的內(nèi)容准谚,寫在這個方法中。
step3:啟動線程:
? ? 創(chuàng)建實(shí)現(xiàn)類的對象:mt
? ? 根據(jù)實(shí)現(xiàn)類對象mt去扣,創(chuàng)建Thread類對象t3柱衔,t4
? ? start()啟動該線程:t3,t4
對比run()和start()
run()愉棱,是線程體唆铐。就是要并發(fā)執(zhí)行內(nèi)容。
start()奔滑,啟動一個線程艾岂?就是該線程準(zhǔn)備就緒了,隨時可以被CPU執(zhí)行朋其。什么時候執(zhí)行王浴,CPU自己說了算脆炎。
一個線程,只能被start一次氓辣。
Thread類的構(gòu)造方法
new Thread();//并發(fā)執(zhí)行秒裕,執(zhí)行run()方法。
new Thread(Runnable target);//并發(fā)執(zhí)行钞啸,執(zhí)行的run是Runnable接口的實(shí)現(xiàn)類實(shí)現(xiàn)run方法