一、上節(jié)課回顧
異常Exception
1、概念:在程序運行的時候,代碼產(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,解析異常
? ? ? ? ? ? 。。。
? ? ? ? 非受檢異常:編譯器編譯程序的時候,不檢查。運行的時候可能產(chǎ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();//打?。寒惓n愋?,異常的原因,哪行產(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)用處:
方法名(實參);//就要處理這個異常:可抓,可拋
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ù)邏輯分析,可以主動拋出一個異常對象。
代碼級別上,主動拋出一個異常對象,提示調(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是運行時異常,程序不強(qiáng)制一定處理該類型的異常。Exception的異常,包含了受檢異常,程序中必須處理該類型的異常。
【面試題】對比throws和throw的區(qū)別。
1、throws關(guān)鍵字,用于表示一個方法向外聲明,該方法不處理異常,交由調(diào)用處處理這個異常。處理異常的一種方式:捕獲,拋出。
2、throw關(guā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è)計一個方法,用于檢驗?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í)行多個程序?那是因為CPU太快啦。。
2.4.3 并行和并發(fā)
串行:任務(wù)一個接一個做。
并行:同時在做多個任務(wù)。(硬件的支持)
并發(fā):在多個任務(wù)之間快速的切換,看起來同時執(zhí)行多個任務(wù)。但是實際上,某一個事件點,執(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中如何實現(xiàn)多任務(wù)的?多線程
Thread類:JDK提供好的,Thread類,就是java中關(guān)于多線程的實現(xiàn)。線程的功能都封裝在了該類中。
?
要使用線程,來實現(xiàn)程序的并發(fā):一個程序,同時干多件事。
比如:唱歌,同時跳舞
Thread類來實現(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:實現(xiàn)Runnable接口,創(chuàng)建線程的方式二
step1:創(chuàng)建實現(xiàn)類,實現(xiàn)Runnable接口
step2:重寫run(),線程體。并發(fā)執(zhí)行的內(nèi)容,寫在這個方法中。
step3:啟動線程:
? ? 創(chuàng)建實現(xiàn)類的對象:mt
? ? 根據(jù)實現(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接口的實現(xiàn)類實現(xiàn)run方法