国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

關于Java異常處理機制的深入理解

2019-11-18 13:09:37
字體:
來源:轉載
供稿:網友

  1 引子
  try…catch…finally恐怕是大家再熟悉不過的語句了,而且感覺用起來也是很簡單,邏輯上似乎也是很輕易理解。不過,我親自體驗的“教訓”告訴我,這個東西可不是想象中的那么簡單、聽話。不信?那你看看下面的代碼,“猜猜”它執行后的結果會是什么?不要往后看答案、也不許執行代碼看真正答案哦。假如你的答案是正確,那么這篇文章你就不用浪費時間看啦。
  
  package myExample.testException;
  
  public class TestException {
  
  public TestException() {
  
  }
  
  boolean testEx() throws Exception{
  
  boolean ret = true;
  
  try{
  
  ret = testEx1();
  
  }catch (Exception e){
  
  System.out.  
  ret = false;
  
  throw e;
  
  }finally{
  
  System.out.println("testEx, finally; return value="+ret);
  
  return ret;
  
  }
  
  }
  
  boolean testEx1() throws Exception{
  
  boolean ret = true;
  
  try{
  
  ret = testEx2();
  
  if (!ret){
  
  return false;
  
  }
  
  System.out.println("testEx1, at the end of try");
  
  return ret;
  
  }catch (Exception e){
  
  System.out.println("testEx1, catch exception");
  
  ret = false;
  
  throw e;
  
  }
  
  finally{
  
  System.out.println("testEx1, finally; return value="+ret);
  
  return ret;
  
  }
  
  }
  
  boolean testEx2() throws Exception{
  
  boolean ret = true;
  
  try{
  
  int b=12;
  
  int c;
  
  for (int i=2;i>=-2;i--){
  
  c=b/i;
  
  System.out.println("i="+i);
  
  }
  
  return true;
  
  }catch (Exception e){
  
  System.out.println("testEx2, catch exception");
  
  ret = false;
  
  throw e;
  
  }
  
  finally{
  
  System.out.println("testEx2, finally; return value="+ret);
  
  return ret;
  
  }
  
  }
  
  public static void main(String[] args) {
  
  TestException testException1 = new TestException();
  
  try{
  
  testException1.testEx();
  
  }catch(Exception e){
  
  e.printStackTrace();
  
  }
  
  }
  
  }
  
  你的答案是什么?是下面的答案嗎?
  
  i=2
  
  i=1
  
  testEx2, catch exception
  
  testEx2, finally; return value=false
  
  testEx1, catch exception
  
  testEx1, finally; return value=false
  
  testEx, catch exception
  
  testEx, finally; return value=false
  
  假如你的答案真的如上面所說,那么你錯啦。^_^,那就建議你仔細看一看這篇文章或者拿上面的代碼按各種不同的情況修改、執行、測試,你會發現有很多事情不是原來想象中的那么簡單的。
  
  現在公布正確答案:
  
  i=2
  
  i=1
  
  testEx2, catch exception
  
  testEx2, finally; return value=false
  
  testEx1, finally; return value=false
  
  testEx, finally; return value=false
  
  2 基礎知識
  2.1 相關概念
  例外是在程序運行過程中發生的異常事件,比如除0溢出、數組越界、文件找不到等,這些事件的發生將阻止程序的正常運行。為了加強程序的魯棒性,程序設計時,必須考慮到可能發生的異常事件并做出相應的處理。C語言中,通過使用if語句來判定是否出現了例外,同時,調用函數通過被調用函數的返回值感知在被調用函數中產生的例外事件并進行處理。全程變量ErroNo經常用來反映一個異常事件的類型。但是,這種錯誤處理機制會導致不少問題。
  
  
java通過面向對象的方法來處理例外。在一個方法的運行過程中,假如發生了例外,則這個方法生成代表該例外的一個對象,并把它交給運行時系統,運行時系統尋找相應的代碼來處理這一例外。我們把生成例外對象并把它提交給運行時系統的過程稱為拋棄(throw)一個例外。運行時系統在方法的調用棧中查找,從生成例外的方法開始進行回朔,直到找到包含相應例外處理的方法為止,這一個過程稱為捕捉(catch)一個例外。
  
  2.2 Throwable類及其子類
  用面向對象的方法處理例外,就必須建立類的層次。類 Throwable位于這一類層次的最頂層,只有它的后代才可以做為一個例外被拋棄。圖1表示了例外處理的類層次。
  
  類Throwable有兩個直接子類:Error和Exception。Error類對象(如動態連接錯誤等),由Java虛擬機生成并拋棄(通常,Java程序不對這類例外進行處理);Exception類對象是Java程序處理或拋棄的對象。它有各種不同的子類分別對應于不同類型的例外。其中類RuntimeException代表運行時由Java虛擬機生成的例外,如算術運算例外ArithmeticException(由除0錯等導致)、數組越界例外ArrayIndexOutOfBoundsException等;其它則為非運行時例外,如輸入輸出例外IOException等。Java編譯器要求Java程序必須捕捉或聲明所有的非運行時例外,但對運行時例外可以不做處理。
  
  2.3 異常處理要害字
  Java的異常處理是通過5個要害字來實現的:try,catch,throw,throws,finally。JB的在線幫助中對這幾個要害字是這樣解釋的:
  
  Throws: Lists the exceptions a method could throw.
  
  Throw:  Transfers control of the method to the exception handler.
  
  Try:  Opening exception-handling statement.
  
  Catch: Captures the exception.
  
  Finally: Runs its code before terminating the program.
  
  2.3.1 try語句
  try語句用大括號{}指定了一段代碼,該段代碼可能會拋棄一個或多個例外。
  
  2.3.2 catch語句
  catch語句的參數類似于方法的聲明,包括一個例外類型和一個例外對象。例外類型必須為Throwable類的子類,它指明了catch語句所處理的例外類型,例外對象則由運行時系統在try所指定的代碼塊中生成并被捕捉,大括號中包含對象的處理,其中可以調用對象的方法。
  
  catch語句可以有多個,分別處理不同類的例外。Java運行時系統從上到下分別對每個catch語句處理的例外類型進行檢測,直到找到類型相匹配的catch語句為止。這里,類型匹配指catch所處理的例外類型與生成的例外對象的類型完全一致或者是它的父類,因此,catch語句的排列順序應該是從非凡到一般。
  
  也可以用一個catch語句處理多個例外類型,這時它的例外類型參數應該是這多個例外類型的父類,程序設計中要根據具體的情況來選擇catch語句的例外處理類型。
  
  2.3.3 finally語句
  try所限定的代碼中,當拋棄一個例外時,其后的代碼不會被執行。通過finally語句可以指定一塊代碼。無論try所指定的程序塊中拋棄或不拋棄例外,也無論catch語句的例外類型是否與所拋棄的例外的類型一致,finally所指定的代碼都要被執行,它提供了統一的出口。通常在finally語句中可以進行資源的清除工作。如關閉打開的文件等。
  
  2.3.4 throws語句
  throws總是出現在一個函數頭中,用來標明該成員函數可能拋出的各種異常。對大多數Exception子類來說,Java 編譯器會強迫你聲明在一個成員函數中拋出的異常的類型。假如異常的類型是Error或 RuntimeException, 或它們的子類,這個規則不起作用, 因為這在程序的正常部分中是不期待出現的。 假如你想明確地拋出一個RuntimeException,你必須用throws語句來聲明它的類型。
  
  2.3.5 throw語句
  throw總是出現在函數體中,用來拋出一個異常。程序會在throw語句后立即終止,它后面的語句執行不到,然后在包含它的所有try塊中(可能在上層調用函數中)從里向外尋找含有與其匹配的catch子句的try塊。
  
  3 要害字及其中語句流程詳解
  3.1     try的嵌套
  你可以在一個成員函數調用的外面寫一個try語句,在這個成員函數內部,寫另一個try語句保護其他代碼。每當碰到一個try語句,異常的框架就放到堆棧上面,直到所有的try語句都完成。假如下一級的try語句沒有對某種異常進行處理,堆棧就會展開,直到碰到有處理這種異常的try語句。下面是一個try語句嵌套的例子。
  
  class MultiNest {
  
  static void procedure() {
  
  try {
  
  int a = 0;
  
  int b = 42/a;
  
  } catch(java.lang.ArithmeticException e) {
  
  System.out.println("in procedure, catch ArithmeticException: " + e);
  
  }
  
  }
  
  public static void main(String args[]) {
  
  try {
  
  procedure();
  
  } c

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 伊金霍洛旗| 南安市| 景洪市| 西盟| 长汀县| 呼伦贝尔市| 资兴市| 武平县| 怀化市| 遵义县| 沙雅县| 宝坻区| 阿拉尔市| 渭南市| 拉孜县| 广德县| 东港市| 荥经县| 开化县| 凤冈县| 班玛县| 安达市| 沛县| 谷城县| 贵德县| 甘谷县| 留坝县| 大渡口区| 乌恰县| 胶州市| 竹山县| 牡丹江市| 巩义市| 吉林省| 邵东县| 新乐市| 体育| 武宣县| 正安县| 嘉兴市| 当涂县|