国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - 全面了解Java中對(duì)于異常的捕捉方法

全面了解Java中對(duì)于異常的捕捉方法

2020-01-20 11:21真實(shí)的歸宿 JAVA教程

這篇文章主要全面介紹了Java中對(duì)于異常的捕捉方法,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

1. try-catch語(yǔ)句

在Java中,異常通過(guò)try-catch語(yǔ)句捕獲。其一般語(yǔ)法形式為:

?
1
2
3
4
5
6
7
8
try {
  // 可能會(huì)發(fā)生異常的程序代碼
} catch (Type1 id1){
  // 捕獲并處置try拋出的異常類(lèi)型Type1
}
catch (Type2 id2){
   //捕獲并處置try拋出的異常類(lèi)型Type2
}

關(guān)鍵詞try后的一對(duì)大括號(hào)將一塊可能發(fā)生異常的代碼包起來(lái),稱(chēng)為監(jiān)控區(qū)域。Java方法在運(yùn)行過(guò)程中出現(xiàn)異常,則創(chuàng)建異常對(duì)象。將異常拋出監(jiān)控區(qū)域之 外,由Java運(yùn)行時(shí)系統(tǒng)試圖尋找匹配的catch子句以捕獲異常。若有匹配的catch子句,則運(yùn)行其異常處理代碼,try-catch語(yǔ)句結(jié)束。

匹配的原則是:如果拋出的異常對(duì)象屬于catch子句的異常類(lèi),或者屬于該異常類(lèi)的子類(lèi),則認(rèn)為生成的異常對(duì)象與catch塊捕獲的異常類(lèi)型相匹配。

例1  捕捉throw語(yǔ)句拋出的“除數(shù)為0”異常。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TestException {
  public static void main(String[] args) {
    int a = 6;
    int b = 0;
    try { // try監(jiān)控區(qū)域
        
      if (b == 0) throw new ArithmeticException(); // 通過(guò)throw語(yǔ)句拋出異常
      System.out.println("a/b的值是:" + a / b);
    }
    catch (ArithmeticException e) { // catch捕捉異常
      System.out.println("程序出現(xiàn)異常,變量b不能為0。");
    }
    System.out.println("程序正常結(jié)束。");
  }
}

運(yùn)行結(jié)果:

?
1
2
3
程序出現(xiàn)異常,變量b不能為0。
 
程序正常結(jié)束。

例1  在try監(jiān)控區(qū)域通過(guò)if語(yǔ)句進(jìn)行判斷,當(dāng)“除數(shù)為0”的錯(cuò)誤條件成立時(shí)引發(fā)ArithmeticException異常,創(chuàng)建 ArithmeticException異常對(duì)象,并由throw語(yǔ)句將異常拋給Java運(yùn)行時(shí)系統(tǒng),由系統(tǒng)尋找匹配的異常處理器catch并運(yùn)行相應(yīng)異 常處理代碼,打印輸出“程序出現(xiàn)異常,變量b不能為0。”try-catch語(yǔ)句結(jié)束,繼續(xù)程序流程。

事實(shí)上,“除數(shù)為0”等ArithmeticException,是RuntimException的子類(lèi)。而運(yùn)行時(shí)異常將由運(yùn)行時(shí)系統(tǒng)自動(dòng)拋出,不需要使用throw語(yǔ)句。

例2  捕捉運(yùn)行時(shí)系統(tǒng)自動(dòng)拋出“除數(shù)為0”引發(fā)的ArithmeticException異常。

?
1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
    int a = 6;
    int b = 0;
    try {
      System.out.println("a/b的值是:" + a / b);
    } catch (ArithmeticException e) {
      System.out.println("程序出現(xiàn)異常,變量b不能為0。");
    }
    System.out.println("程序正常結(jié)束。");
  }
}

運(yùn)行結(jié)果:

?
1
2
3
程序出現(xiàn)異常,變量b不能為0。
 
程序正常結(jié)束。

例2  中的語(yǔ)句:

?
1
System.out.println(“a/b的值是:” + a/b);

在運(yùn)行中出現(xiàn)“除數(shù)為0”錯(cuò)誤,引發(fā)ArithmeticException異常。運(yùn)行時(shí)系統(tǒng)創(chuàng)建異常對(duì)象并拋出監(jiān)控區(qū)域,轉(zhuǎn)而匹配合適的異常處理器catch,并執(zhí)行相應(yīng)的異常處理代碼。

由于檢查運(yùn)行時(shí)異常的代價(jià)遠(yuǎn)大于捕捉異常所帶來(lái)的益處,運(yùn)行時(shí)異常不可查。Java編譯器允許忽略運(yùn)行時(shí)異常,一個(gè)方法可以既不捕捉,也不聲明拋出運(yùn)行時(shí)異常。

例3  不捕捉、也不聲明拋出運(yùn)行時(shí)異常。

?
1
2
3
4
5
6
7
8
public class TestException {
  public static void main(String[] args) {
    int a, b;
    a = 6;
    b = 0; // 除數(shù)b 的值為0
    System.out.println(a / b);
  }
}

運(yùn)行結(jié)果:

?
1
2
Exception in thread “main” java.lang.ArithmeticException: / by zero
at Test.TestException.main(TestException.java:8)

例4  程序可能存在除數(shù)為0異常和數(shù)組下標(biāo)越界異常。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class TestException {
  public static void main(String[] args) {
    int[] intArray = new int[3];
    try {
      for (int i = 0; i <= intArray.length; i++) {
        intArray[i] = i;
        System.out.println("intArray[" + i + "] = " + intArray[i]);
        System.out.println("intArray[" + i + "]模 " + (i - 2) + "的值: "
            + intArray[i] % (i - 2));
      }
    } catch (ArrayIndexOutOfBoundsException e) {
      System.out.println("intArray數(shù)組下標(biāo)越界異常。");
    } catch (ArithmeticException e) {
      System.out.println("除數(shù)為0異常。");
    }
    System.out.println("程序正常結(jié)束。");
  }
}

運(yùn)行結(jié)果:

?
1
2
3
4
5
6
7
8
9
10
intArray[0] = 0
 
intArray[0]模 -2的值: 0
 
intArray[1] = 1
 
intArray[1]模 -1的值: 0
 
intArray[2] = 2
<p>除數(shù)為0異常。</p><p>程序正常結(jié)束。</p>

例4  程序可能會(huì)出現(xiàn)除數(shù)為0異常,還可能會(huì)出現(xiàn)數(shù)組下標(biāo)越界異常。程序運(yùn)行過(guò)程中ArithmeticException異常類(lèi)型是先行匹配的,因此執(zhí)行相匹配的catch語(yǔ)句:

?
1
2
3
catch (ArithmeticException e){
   System.out.println("除數(shù)為0異常。");
 }

需要注意的是,一旦某個(gè)catch捕獲到匹配的異常類(lèi)型,將進(jìn)入異常處理代碼。一經(jīng)處理結(jié)束,就意味著整個(gè)try-catch語(yǔ)句結(jié)束。其他的catch子句不再有匹配和捕獲異常類(lèi)型的機(jī)會(huì)。

Java通過(guò)異常類(lèi)描述異常類(lèi)型,異常類(lèi)的層次結(jié)構(gòu)如圖1所示。對(duì)于有多個(gè)catch子句的異常程序而言,應(yīng)該盡量將捕獲底層異常類(lèi)的catch子 句放在前面,同時(shí)盡量將捕獲相對(duì)高層的異常類(lèi)的catch子句放在后面。否則,捕獲底層異常類(lèi)的catch子句將可能會(huì)被屏蔽。

RuntimeException異常類(lèi)包括運(yùn)行時(shí)各種常見(jiàn)的異常,ArithmeticException類(lèi)和ArrayIndexOutOfBoundsException類(lèi)都是它的子類(lèi)。因此,RuntimeException異常類(lèi)的catch子句應(yīng)該放在 最后面,否則可能會(huì)屏蔽其后的特定異常處理或引起編譯錯(cuò)誤。

2. try-catch-finally語(yǔ)句

try-catch語(yǔ)句還可以包括第三部分,就是finally子句。它表示無(wú)論是否出現(xiàn)異常,都應(yīng)當(dāng)執(zhí)行的內(nèi)容。try-catch-finally語(yǔ)句的一般語(yǔ)法形式為:

?
1
2
3
4
5
6
7
8
9
try {
  // 可能會(huì)發(fā)生異常的程序代碼
} catch (Type1 id1) {
  // 捕獲并處理try拋出的異常類(lèi)型Type1
} catch (Type2 id2) {
  // 捕獲并處理try拋出的異常類(lèi)型Type2
} finally {
  // 無(wú)論是否發(fā)生異常,都將執(zhí)行的語(yǔ)句塊
}

例5  帶finally子句的異常處理程序。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TestException {
  public static void main(String args[]) {
    int i = 0;
    String greetings[] = { " Hello world !", " Hello World !! ",
        " HELLO WORLD !!!" };
    while (i < 4) {
      try {
        // 特別注意循環(huán)控制變量i的設(shè)計(jì),避免造成無(wú)限循環(huán)
        System.out.println(greetings[i++]);
      } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("數(shù)組下標(biāo)越界異常");
      } finally {
        System.out.println("--------------------------");
      }
    }
  }
}

運(yùn)行結(jié)果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Hello world !
 
————————–
 
Hello World !!
 
————————–
 
HELLO WORLD !!!
 
————————–
 
數(shù)組下標(biāo)越界異常
 
————————–

在例5中,請(qǐng)?zhí)貏e注意try子句中語(yǔ)句塊的設(shè)計(jì),如果設(shè)計(jì)為如下,將會(huì)出現(xiàn)死循環(huán)。如果設(shè)計(jì)為:

?
1
2
3
try {
   System.out.println (greetings[i]); i++;
}

小結(jié):

 

try 塊:用于捕獲異常。其后可接零個(gè)或多個(gè)catch塊,如果沒(méi)有catch塊,則必須跟一個(gè)finally塊。
catch 塊:用于處理try捕獲到的異常。
finally 塊:無(wú)論是否捕獲或處理異常,finally塊里的語(yǔ)句都會(huì)被執(zhí)行。當(dāng)在try塊或catch塊中遇到return語(yǔ)句時(shí),finally語(yǔ)句塊將在方法返回之前被執(zhí)行。在以下4種特殊情況下,finally塊不會(huì)被執(zhí)行:
a.在finally語(yǔ)句塊中發(fā)生了異常。
b.在前面的代碼中用了System.exit()退出程序。
c.程序所在的線程死亡。
d.關(guān)閉CPU。

3. try-catch-finally 規(guī)則(異常處理語(yǔ)句的語(yǔ)法規(guī)則):

a.  必須在 try 之后添加 catch 或 finally 塊。try 塊后可同時(shí)接 catch 和 finally 塊,但至少有一個(gè)塊。
b. 必須遵循塊順序:若代碼同時(shí)使用 catch 和 finally 塊,則必須將 catch 塊放在 try 塊之后。
c. catch 塊與相應(yīng)的異常類(lèi)的類(lèi)型相關(guān)。
d. 一個(gè) try 塊可能有多個(gè) catch 塊。若如此,則執(zhí)行第一個(gè)匹配塊。即Java虛擬機(jī)會(huì)把實(shí)際拋出的異常對(duì)象依次和各個(gè)catch代碼塊聲明的異常類(lèi)型匹配,如果異常對(duì)象為某個(gè)異常類(lèi)型或其子類(lèi)的實(shí)例,就執(zhí)行這個(gè)catch代碼塊,不會(huì)再執(zhí)行其他的 catch代碼塊
e. 可嵌套 try-catch-finally 結(jié)構(gòu)。
f. 在 try-catch-finally 結(jié)構(gòu)中,可重新拋出異常。
g. 除了下列情況,總將執(zhí)行 finally 做為結(jié)束:JVM 過(guò)早終止(調(diào)用 System.exit(int));在 finally 塊中拋出一個(gè)未處理的異常;計(jì)算機(jī)斷電、失火、或遭遇病毒攻擊。

4. try、catch、finally語(yǔ)句塊的執(zhí)行順序:

a.當(dāng)try沒(méi)有捕獲到異常時(shí):try語(yǔ)句塊中的語(yǔ)句逐一被執(zhí)行,程序?qū)⑻^(guò)catch語(yǔ)句塊,執(zhí)行finally語(yǔ)句塊和其后的語(yǔ)句;

b.當(dāng)try捕獲到異常,catch語(yǔ)句塊里沒(méi)有處理此異常的情況:當(dāng)try語(yǔ)句塊里的某條語(yǔ)句出現(xiàn)異常時(shí),而沒(méi)有處理此異常的catch語(yǔ)句塊時(shí),此異常將會(huì)拋給JVM處理,finally語(yǔ)句塊里的語(yǔ)句還是會(huì)被執(zhí)行,但finally語(yǔ)句塊后的語(yǔ)句不會(huì)被執(zhí)行;

c.當(dāng)try捕獲到異常,catch語(yǔ)句塊里有處理此異常的情況:在try語(yǔ)句塊中是按照順序來(lái)執(zhí)行的,當(dāng)執(zhí)行到某一條語(yǔ)句出現(xiàn)異常時(shí),程序?qū)⑻絚atch語(yǔ)句塊,并與catch語(yǔ)句塊逐一匹配,找到與之對(duì)應(yīng)的處理程序,其他的catch語(yǔ)句塊將不會(huì)被執(zhí)行,而try語(yǔ)句塊中,出現(xiàn)異常之后的語(yǔ)句也不會(huì)被執(zhí)行,catch語(yǔ)句塊執(zhí)行完后,執(zhí)行finally語(yǔ)句塊里的語(yǔ)句,最后執(zhí)行finally語(yǔ)句塊后的語(yǔ)句;

圖示try、catch、finally語(yǔ)句塊的執(zhí)行:

全面了解Java中對(duì)于異常的捕捉方法

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人午夜精品一区二区三区 | 亚洲精品视频在线观看网站 | 97精品久久 | 91精品网 | 国产区在线 | 亚洲视频在线观看 | 伊人一区 | 亚洲av毛片| 国产精品久久久久久久久久久久 | 国产精品jizz在线观看麻豆 | 日韩视频中文字幕 | 欧美在线亚洲 | 久久99精品久久久久 | 在线视频 91| 亚洲视频中文字幕 | 狼人综合网| 五月宗合网 | 国产精品视频入口 | 欧美 日韩 国产 成人 在线 | 开心久久婷婷综合中文字幕 | 少妇久久久 | 久久久综合色 | 中文字幕在线免费观看 | 国产天天操 | 求av网站 | 国产一区二区精品在线 | 日韩视频中文字幕 | 成人久久| 糈精国产xxxx在线观看 | 国产精品久久久久国产精品 | 国产精品一区二区久久 | 国产精品一区二区av | 四虎最新紧急更新地址 | 不卡一区二区三区视频 | 国产理论在线 | 99re在线精品 | 在线欧美一区 | 欧美日韩一区二区在线 | 色黄网站 | 一级在线观看视频 | 综合久久综合久久 |