二譬正、如何處理Exception的異常
java提供的是異常處理的抓拋模式
1."拋":當我們執(zhí)行代碼時簇捍,一旦出現(xiàn)異常划滋,就會在異常的代碼處生成一個對應的異常處理對象扑媚,并將此對象拋出腰湾。(自動拋出/手動拋出)
>一旦拋出此類異常對象,那么程序就終止執(zhí)行疆股。
>此異常類的對象拋給方法的調(diào)用者檐盟。
2."抓":抓住上一步拋出來的異常類的對象。如何抓押桃?即為異常處理的方式。
java提供了兩種方式用來處理一個異常類的對象导犹。
處理的方式一:
try{
//可能出現(xiàn)異常的代碼
}catch(Exception1 e1){
//處理的方式1
}catch(Exception2 e2){
//處理的方式2
}finally{
//一定要執(zhí)行的代碼
}
注:1.try內(nèi)聲明的變量唱凯,類似于局部變量,出了try{}語句谎痢,就不能被調(diào)用
2.finally是可選的磕昼。
3.catch語句內(nèi)部是對異常對象的處理:(右鍵try-catch)
>getMessage();(獲取message)
>printStackTrace();(打印出異常的堆棧信息)
>也可以自己定義打印节猿;System.out.println("出現(xiàn)異常了");
4.可以有多個catch語句票从,try中拋出的異常類對象從上往下去匹配catch中的異常類的類型漫雕,
一旦滿足就執(zhí)行catch中的代碼。執(zhí)行完峰鄙,就跳出其后的多條catch語句
5.如果異常處理了浸间,那么其后的代碼繼續(xù)執(zhí)行。
6.若catch中多個異常類型是“并列”關(guān)系吟榴,孰上孰下都可以魁蒜。
若catch中多個異常類型是“包含”關(guān)系,須將子類放在父類上面吩翻,進行處理兜看。否則報錯!
7.finally中存放的是一定會被執(zhí)行的代碼狭瞎。不管try中细移、catch中是否仍有異常未被處理,以及是否有return語句熊锭。
8.try—catch是可以嵌套的
三弧轧、對于運行時異常來說,可以不顯示的進行處理球涛。
對于編譯時異常來說劣针,必須要顯示的進行處理。
public class TestException1 {
//1.數(shù)組下標越界異常ArrayIndexOutOfBoundsException(*自己定義異常打印輸出*)
@Test
public void test2(){
try{
int[] i = new int[10];
System.out.println(i[10]);
}catch(Exception e){
System.out.println("出現(xiàn)了數(shù)組下標越界異常");
}
}
//2.算數(shù)異常:ArithmeticException(*打印出堆棧信息*)
@Test//右鍵-surround with-try/catch
public void test3(){
try {
int i = 9;
System.out.println(i/0);
} catch (Exception e) {
e.printStackTrace();
}
}
//3.類型轉(zhuǎn)換異常:ClassCastException(*多個catch時亿扁,只執(zhí)行一個*)
@Test
public void test4(){
try {
Object obj = new Date();
String str = (String) obj;//編譯沒有錯誤捺典,因為str以為自己將obj字符串轉(zhuǎn)換。
} catch(ClassCastException e){
System.out.println("出現(xiàn)類型轉(zhuǎn)換異常了");
} catch (Exception e) {
e.printStackTrace();
}
}
//4.空指針異常:NullPointerException(*其后的代碼順利執(zhí)行*)
@Test
public void test5(){
Person p = new Person();
try {
p = null;//一旦定義為空从祝。襟己。。
System.out.println(p.toString());
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println("hello牍陌!美眉擎浴!");
}
//---------------------------------------------------------
//編譯時異常
//一共三處異常,兩種類型
//new FileInputStream是 FileNotFoundException毒涧;
//fis.read()是IOException贮预;
//fis.close();也是IOException;
//注:FileNotFoundException是IOException的子類
@Test
public void test6(){
FileInputStream fis = null;
try {
fis = new FileInputStream(new File("hello.txt"));
int b;
while ((b = fis.read())!= -1) {
System.out.println((char)b);
}
// fis.close();這個語句在catch之外契讲,如果出現(xiàn)異常仿吞,直接退出,
// 這條語句可能不被執(zhí)行捡偏,占用系統(tǒng)稀有資源唤冈,所以必須要被執(zhí)行,所以最好放到finally中
} catch (FileNotFoundException e1) {
System.out.println(e1.getMessage());
} catch (IOException e1) {
System.out.println(e1.getMessage());
}finally{
try {
fis.close();//放過來以后也有可能發(fā)生異常银伟,可以再抓拋一次你虹,fis沒有定義會報錯
} catch (Exception e) {
e.printStackTrace();
}
}
}
}