Java知識

異常:異常是程序正常執(zhí)行過程中出現(xiàn)的不正常的情況小染。

異常捕獲的順序是怎樣的呢?當一個異常發(fā)生或拋出。? ? 那么正常的程序執(zhí)行序列將被終

止,程序將對異常進行處理客扎,我們稱之為拋出異常被捕獲。 JAVA 中通過使用 try-catch 語句把可能拋出異常的語句包起來步做。

怎樣捕獲一個異常呢卡乾。

a、 把正常運行的代碼放在 try 塊里信卡。

b隔缀、 如果程序中出現(xiàn)了異常就把異常拋出在? ? catch 中,如果 catch中能捕獲拋出的異常傍菇。

那么就會進行處理猾瘸。處理的代碼寫在 catch 塊中。

try 程序塊里面的語句是按順序執(zhí)行的語句知識點:1、? ? 什么是異常牵触。異常是程序正常執(zhí)行過程中出現(xiàn)的不正常的情況淮悼。例如:? ? 人在成長過程中,是個正常的執(zhí)行過程揽思,但成長過程中會經常生病袜腥,這就是異常。為了避免這種不正 常的情況钉汗,我們會采取一系列措施瞧挤,比如:從小鍛煉身體,吃新鮮干凈的食物儡湾,營養(yǎng)合 理的搭配特恬,以增強我們的體質。提高抗病能力徐钠。程序我們?yōu)榱颂岣咚\行時的健壯性癌刽, 我們也得采用一些措施。那么怎么提高程序的健壯性呢尝丐? JAVA 程序中我通過異常的捕 獲來增加程序的健壯性显拜。2、? ? 異常捕獲的順序是怎樣的呢爹袁?當一個異常發(fā)生或拋出远荠。? ? 那么正常的程序執(zhí)行序列將被終止,程序將對異常進行處理失息,我們稱之為拋出異常被捕獲譬淳。 JAVA 中通過使用 try-catch 語句把可能拋出異常的語句包起來。例如:前面講到資源文件類 Properties 類在進行文 件加載時盹兢,使用以下語句捕捉異常邻梆。try{Properties pro=new Properties();Pro.load(new FileInputStream( “c:/abc.properties ”));}catch(IOException e){System.out.println(e);}3、? ? 異常的類型是怎樣的呢绎秒?

所有異常類的超類是 Throwable 浦妄。在 Throwable 下有兩個子類,一個是 Error 见芹,另一個是 Exception 剂娄。 Error 是錯誤,程序員無法控制玄呛, Exception 是異常阅懦,程序員可以通過異常捕獲加 以控制。例如: 電腦運行中中毒了把鉴, 我們可以通過殺毒軟件來處理故黑,處理完了以后可以繼續(xù) 使用, 這叫異常庭砍,我們可以控制场晶。但電腦出現(xiàn)了藍屏或死機的時候,我們就不能進行任何操 作了怠缸。這就是錯誤诗轻,我們無法控制。4揭北、? ? 程序中異常是怎么發(fā)生的呢扳炬?

請輸入“年齡 ” );

showInputDialog 得到的是個字符串。

String inputStr = JOptionPane.showInputDialog(null, int age = Integer.parseInt(inputStr); 以上代碼要求用戶輸入年齡搔体,年齡是個數(shù)字恨樟。但通過

所以我們需要 Integer.parseInt(inputStr) ,將字符串轉成數(shù)字疚俱。這個時候劝术,如果用戶輸入的不 是 一 個數(shù) 字 型的 字 符串 , 而 是 一個 非 數(shù)字 的字 符 串( 如 字母 呆奕、符 號 )养晋, 在 進行 Integer.parseInt(inputStr) 轉化是就會發(fā)生一個異常。如果我們不對它作任何處理梁钾,程序就有 可能因此終止掉绳泉。5、 怎樣捕獲一個異常呢姆泻。a零酪、 把正常運行的代碼放在 try 塊里。b拇勃、 如果程序中出現(xiàn)了異常就把異常拋出在? ? catch 中蛾娶,如果 catch中能捕獲拋出的異常。那么就會進行處理潜秋。處理的代碼寫在 catch 塊中蛔琅。try 程序塊里面的語句是按順序執(zhí)行的語句當 try 程序塊里面的語句拋出一個異常的時候,程序的控制轉向了相匹配的? ? catch 程序塊峻呛, catch 程序塊里面的語句被執(zhí)行罗售。當異常發(fā)生后, 程序執(zhí)行將忽略 try 程序塊中剩余的語句钩述, 繼續(xù)執(zhí)行程序塊后面的語句寨躁。如果在 面的語句try 程序塊中沒有拋出異常,那么 catch 塊將被忽略牙勘。程序將繼續(xù)執(zhí)行 try-catch例如:try{System.out.println( int x=4/0;//2開始 ”);//1System.out.println(}catch(Exception e){System.out.println(}System.out.println( 這是發(fā)生異常的情況职恳,在執(zhí)行 ”);//3發(fā)生異常 ”);//4異常處理外部 ”);try 塊里順序執(zhí)行所禀,先打出“開始” ,沒有異常繼續(xù)執(zhí)行放钦,當 執(zhí)行到第 2行時色徘,因為 0 不能做除數(shù),所以會發(fā)生一個算術異常操禀。這個時候就會跳過 try 塊 里剩下的語句轉去執(zhí)行 catch 塊中的內容褂策。 所以第 3行就不能執(zhí)行。 跳到 catch 塊中執(zhí)行第 4

句颓屑,打出“發(fā)生異辰锛牛” 。執(zhí)行完以后接著往下順序執(zhí)行揪惦。打出第 5 行“異常處理外部” 遍搞。try{System.out.println( “開始 ”);//1int x=4/2;//2System.out.println( “執(zhí)行 ”);//3}catch(Exception e){System.out.println( “發(fā)生異常 ”);//4}System.out.println( “異常處理外部 ”);這是正常情況,在 try 塊里順序執(zhí)行器腋,先打出“開始” 尾抑,沒有異常繼續(xù)執(zhí)行,當執(zhí)行到 第 2 行時蒂培,得到 x 的值為 2 再愈,不會有異常。這個時候繼續(xù)執(zhí)行到第? ? 3 行护戳,打出“執(zhí)行” 翎冲。因為在 try 塊中沒有任何異常,執(zhí)行完以后接著往下順序執(zhí)行媳荒。打出第 5 行“異常處理外部” 抗悍。在 Throwable 類中有兩個方法,可以用于獲取拋出異常的信息getMessageprintStackTrace6钳枕、 拋出異常 在一個 try-catch 語句中缴渊,當有多個 catch 塊的時候,它們被順序檢查在檢查過程中鱼炒,注意異常的匹配關系是很重要的當一個異常被拋出衔沼, 與它相匹配的 catch塊被執(zhí)行, 其它的 catch 塊昔瞧,就被忽略掉不再執(zhí) 行如果沒有 catch 塊匹配拋出的異常指蚁,那么系統(tǒng)會在堆棧中搜索,找到一個匹配的捕獲方 法自晰。如果仍然沒有找到凝化,那么系統(tǒng)將處理拋出異常什么叫異常和 catch 塊相匹配:1、拋出的異常和捕捉的異常是同一個類2酬荞、拋出的異常是捕捉異常的子類3搓劫、多個 catch 塊中 如果捕捉的異常之間有繼承關系 那么不要把父類放在子類之 前(這種做法也不被允許)4瞧哟、盡量不要偷懶 使用具體異常類而不要使用 Exception例如 :try {int [] a= new int [4] ;System. out .println(a[6]);//1int i=3/0;//2

} catch (java.lang.ArithmeticException e){//? ? 捕獲第 2行異常System. out .println( "算術錯誤 ");}catch (java.lang.ArrayIndexOutOfBoundsException e){ //? ? 捕獲第 1行異常System. out .println( "數(shù)組下標越界 ");}不同的異常由不同的 catch 塊進行捕獲。發(fā)生異常時由相應的 catch 塊進行處理枪向。Catch 塊中怎么捕獲異常勤揩?try{int i=3/0;}catch(java.lang.ArithmeticException e){// 拋出異常和捕獲異常是同一個類 System.out.println(" 算術錯誤 ");}try{ int i=3/0;}catch(java.lang.Exception e){// 拋出異常是捕獲異常的子類 System.out.println(" 算術錯誤 ");try {int [] a= new int [4] ;System. out .println(a[6]);} catch (java.lang. Exception e){System. out .println( "發(fā)生異常 ");}catch (java.lang.ArrayIndexOutOfBoundsException e){System. out .println( "數(shù)組下標越界 ");}這種方 式不被 允許,因為 catch 塊前一個異常 Exception 是后一 個異常 ArrayIndexOutOfBoundsException 的父類遣疯。所以有異常前一個異常 catch 塊都捕 獲了。后一個 catch 塊永遠不會被執(zhí)行凿傅。編譯會出錯缠犀。try {int [] a= new int [4] ;System. out .println(a[6]);

} catch (java.lang.ArrayIndexOutOfBoundsException e){System. out .println( "數(shù)組下標越界 ");}catch (java.lang.Exception e){ System. out .println( "發(fā)生異常 ");}這種方式允許。如果有數(shù)組下標越界異常由第一個 catch 塊處理聪舒。如果有其它異常 由第二個 catch 塊處理辨液。7、如果有一塊代碼不管是否發(fā)生異常拋出都要被執(zhí)行箱残,我們使用關鍵字 finally 這樣的機 制有助于我們進行系統(tǒng)資源的回收滔迈。比如:在數(shù)據(jù)庫操作時,如果發(fā)生了異常被辑,那么數(shù) 據(jù)庫連接就可能不會關閉燎悍,而一直長駐內存。在進行 IO 文件讀取和寫入時盼理,如果發(fā)生 了異常就可能流不會關閉谈山。所以使用 finally 可以解決這樣的問題。Try{}catch(){}finally{

這樣的結構可以用警察抓小偷來說明宏怔,警察抓小偷奏路,如果小偷守法(沒有異常)則警察 就不會抓他,如果小偷違法(發(fā)生異常) 不管抓沒有抓到臊诊,警察工資照拿鸽粉。


finally 內容”

因為發(fā)生異常,所以 catch 里內容執(zhí)行抓艳。執(zhí)行結果是“發(fā)生異炒セ”和“8、 關于 finally 的問題 大家都知道 return 是跳出方法的語句玷或, 如果在 try 里有 return 語句那么 finally 里的 內容會不會執(zhí)行呢威兜?答案是會的。會在 return 語句之前執(zhí)行庐椒,執(zhí)行完 finally 語句之后椒舵, return 語句再執(zhí)行。public void change(){try {int x=9/0;//1 return;} catch (Exception e){System. out .println( "發(fā)生異常 ");}finally {System. out .println( "finally 內容 ");}System. out .println( " 異常外部內容 " );}該代碼發(fā)生了異常约谈。 所以第一行代碼以下語句會被忽略笔宿, 所以 return 語句不會執(zhí)行 該代碼執(zhí)行結果為“發(fā)生異忱缰樱”、“ finally 內容”泼橘、“異常外部內容”public void change(){ try {int x=9/4;System. out .println( "正常執(zhí)行 "); return;} catch (Exception e){System. out .println( "發(fā)生異常 ");}finally {System. out .println( "finally 內容 ");}System. out .println( " 異常外部內容 " );該代碼沒有發(fā)生異常涝动。順序執(zhí)行。先打“正常執(zhí)行”炬灭,遇到 return 語句后醋粟,在返回 前,先執(zhí)行“ finally 內容”再做返回重归。因為方法已經跳出米愿,所以“異常外部內容” 不會執(zhí)行。

finally 在任何時候都會執(zhí)行鼻吮,但有一個例外那就是程序終止時育苟,不會執(zhí)行 public void change(){try {

“正常執(zhí)行 ”);"發(fā)生異常 ");"finally 內容 ");" 異常外部內容 " );

int x=9/4;System.out.println(System.exit(0);} catch (Exception e){System. out .println( } finally {System. out .println( }System. out .println(因為沒有異常, 所以“正常執(zhí)行” 會打出來椎木, 但這個時候程序終止運行违柏。 所以 finally 內容不會打出來。9香椎、關于異常對象異常也是一個對象漱竖。它是 Exception 類或子類的一個對象public void change(){try {int x=9/0;//1} catch (Exception e)//2{System. out .println( "發(fā)生異常 ");}}在執(zhí)行到第 1 行時,發(fā)生了異常畜伐。這時候會產生一個和異常相匹配的異常對象闲孤。然 后在第 2 行時,用一個 Exception e 的一個變量去指向它烤礁。這個時候讼积,如果人為的拋出一個異常也可以達到相同的效果。這就是 throw 語句脚仔。將顯示的產生一個異常對象勤众,并做拋出。語法如下:throw 異常對象 (throw new Exception()) 鲤脏。

10们颜、傳播異常 一個方法可以拋出異常,這樣的話猎醇,在方法里我們就不用去捕獲方法里可能發(fā)生的相關 異常窥突。那么誰去處理這個異常呢?由調用該方法的代碼塊去處理硫嘶。那么怎么樣在方法里 拋出異常呢阻问?我們需要修改方法的聲明頭,聲明方法傳播的異常類型我們使用關鍵字 throws 來完成這個聲明例: void c( ) throws Exception {}void d( ) throws Exception {}在 d() 方法中拋出了 Exception 異常沦疾,但在方法體里卻可以不產生異常對象称近。就象要開槍 先瞄準第队,但瞄準后可以不開槍。11刨秆、異常的類型異常會為編譯期異常和運行期異常凳谦。 (或檢查異常和非檢查異常)其中運行期異常是 RuntionException 類和它的子類。除此之外都是編譯期異常衡未。編譯期異常是我們必須要捕獲的尸执,而運行期異常卻可以捕獲,也可以不捕獲缓醋。就象警察 一樣如失,大案和要案是必須要立案偵破的,而小偷小摸的毛賊改衩,可以抓也可以不抓岖常。編譯異常我們必須要處理驯镊,要么用 try-catch 包圍葫督,要么做方法拋出。如果一個方法拋出編譯期異常板惑,那么調用該方法時橄镜,必須處理,如果拋出運行期異常冯乘, 那么調用該方法時洽胶,可處理可不處理。void C( ) throws Exception {}void a(){try{ c();}catch(Exception e){System.out.println( “異常 ”);}

public class TException{public static void main(String[] args){TException te = new TException();te.throwException();//1te.throwAException();//2te.throwCException();//3te.throwDException();//4}public void throwAException() throws Throwable{}public void throwCExcetion() throws Exception{}public void throwException() throws MyException{}public void throwDException() throws MyCException{}}class MyCException extends Exception{public MyCException(){}public MyCException(String msg){super(msg);}}class MyException extends RuntimeException{public MyException(){}public MyException(String msg){super(msg);}}代碼分析:在 main 方法里分別調用了四個方法裆馒。其中第 1 行代碼調用 throwException 方法姊氓。該方 法拋出 MyException 異常。而 MyException 是 RuntimeException 的子類喷好,所以可以不處 理翔横。不會發(fā)生編譯錯誤。 第 2行代碼調用 throwAException 方法梗搅,該方法拋出 Throwable 禾唁。 這是所有異常和錯誤的超類,包含編譯期異常无切,所以必須處理荡短。直接寫的話,編譯會出 錯哆键。怎樣捕獲一個異常呢掘托。

a、 把正常運行的代碼放在 try 塊里籍嘹。

b烫映、 如果程序中出現(xiàn)了異常就把異常拋出在? ? catch 中沼本,如果 catch中能捕獲拋出的異常。

那么就會進行處理锭沟。處理的代碼寫在 catch 塊中抽兆。

try 程序塊里面的語句是按順序執(zhí)行的語句當 try 程序塊里面的語句拋出一個異常的時候,程序的控制轉向了相匹配的? ? catch 程序塊族淮, catch 程序塊里面的語句被執(zhí)行辫红。當異常發(fā)生后, 程序執(zhí)行將忽略 try 程序塊中剩余的語句祝辣, 繼續(xù)執(zhí)行程序塊后面的語句贴妻。如果在 面的語句

try 程序塊中沒有拋出異常,那么 catch 塊將被忽略蝙斜。程序將繼續(xù)執(zhí)行 try-catch

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末名惩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子孕荠,更是在濱河造成了極大的恐慌娩鹉,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稚伍,死亡現(xiàn)場離奇詭異弯予,居然都是意外死亡,警方通過查閱死者的電腦和手機个曙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門锈嫩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人垦搬,你說我怎么就攤上這事呼寸。” “怎么了猴贰?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵对雪,是天一觀的道長。 經常有香客問我糟趾,道長慌植,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任义郑,我火速辦了婚禮蝶柿,結果婚禮上,老公的妹妹穿的比我還像新娘非驮。我一直安慰自己交汤,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芙扎,像睡著了一般星岗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戒洼,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天俏橘,我揣著相機與錄音,去河邊找鬼圈浇。 笑死寥掐,一個胖子當著我的面吹牛,可吹牛的內容都是我干的磷蜀。 我是一名探鬼主播召耘,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼褐隆!你這毒婦竟也來了污它?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤庶弃,失蹤者是張志新(化名)和其女友劉穎衫贬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虫埂,經...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡祥山,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年圃验,在試婚紗的時候發(fā)現(xiàn)自己被綠了掉伏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡澳窑,死狀恐怖斧散,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情摊聋,我是刑警寧澤鸡捐,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站麻裁,受9級特大地震影響箍镜,放射性物質發(fā)生泄漏。R本人自食惡果不足惜煎源,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一色迂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧手销,春花似錦歇僧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祸轮。三九已至,卻和暖如春侥钳,著一層夾襖步出監(jiān)牢的瞬間适袜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工舷夺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痪蝇,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓冕房,卻偏偏與公主長得像躏啰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耙册,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內容

  • @(Java) 面向對象編程期末考復習筆記 了解Java Java具有面向對象给僵、與平臺(由系統(tǒng)OS和處理器CPU構...
    _好好學習閱讀 253評論 0 0
  • String、StringBuffer详拙、StringBuilder 區(qū)別對比:String在進行 str = st...
    在南方的北方人_Elijah閱讀 311評論 0 2
  • 1. 異常處理 異常是程序中的一些錯誤帝际,但并不是所有的錯誤都是異常,并且有些錯誤是可以避免的饶辙。 異常通常發(fā)生的原因...
    馳同學閱讀 282評論 0 0
  • 安排如下 1.看leetcode 2.看idea 動態(tài)綁定機制蹲诀,屬性沒有動態(tài)綁定機制,方法有 當調用對象方法的時...
    Sonyhandsome閱讀 166評論 0 0
  • 一弃揽、Java跨平臺的理解(Write Once, Run Anywhere) “一次編譯脯爪、到處運行”說的是J...
    歐陽譽晨曦閱讀 285評論 0 1