亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

關于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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久亚洲精品国产亚洲老地址| 国产精品成av人在线视午夜片| 国产精品视频免费在线| 色综合色综合久久综合频道88| 最近2019年手机中文字幕| 青青精品视频播放| 亚洲精品wwwww| 国产福利精品av综合导导航| 国产亚洲欧洲在线| 亚洲第一av网| 久久精品成人一区二区三区| 精品亚洲一区二区三区四区五区| 日韩精品免费综合视频在线播放| 亚洲第一免费网站| 欧美国产欧美亚洲国产日韩mv天天看完整| 尤物yw午夜国产精品视频明星| 日韩av在线最新| 亚洲国产黄色片| 国产午夜精品视频免费不卡69堂| 久久国产精品影片| 欧美日韩一区二区三区在线免费观看| 亚洲成人av片在线观看| 国产成人avxxxxx在线看| 国产精品亚洲自拍| 精品欧美国产一区二区三区| 国产成人在线播放| 久久久久久久久久久av| 日韩色av导航| 国产日本欧美一区二区三区在线| 亚洲综合小说区| 亚洲最大福利视频网| 国产99久久精品一区二区永久免费| 国产91精品久久久久久| 在线激情影院一区| 欧美xxxx18国产| 国产精品亚洲综合天堂夜夜| 国产精品三级久久久久久电影| 日韩在线视频网站| 亚洲网站在线看| 国产有码在线一区二区视频| 国产亚洲精品高潮| 亚洲欧美另类中文字幕| 国产亚洲精品久久久久久777| 欧美老女人www| 激情成人中文字幕| 亚洲国产成人精品女人久久久| 亚洲欧美日韩精品久久亚洲区| 中文字幕亚洲无线码在线一区| 亚洲电影在线观看| 精品久久香蕉国产线看观看gif| 在线视频欧美性高潮| 黑人巨大精品欧美一区二区三区| 欧美激情精品久久久久久黑人| 国产精品久久久久久av下载红粉| 久久久精品一区二区| 亚洲第一男人天堂| 91在线观看免费网站| 亚洲午夜未删减在线观看| 91在线视频成人| 国产网站欧美日韩免费精品在线观看| 色婷婷av一区二区三区久久| 亚洲欧洲美洲在线综合| 91在线免费看网站| 国产丝袜一区视频在线观看| 亚洲人成绝费网站色www| 亚洲一区二区精品| 亚洲国产一区二区三区四区| 欧美日本精品在线| 少妇高潮久久77777| 欧美高清视频一区二区| 久久国产精品久久久久久久久久| 日韩成人在线网站| 欧美黑人一级爽快片淫片高清| 精品视频在线播放免| 国产精品美女av| 日韩高清人体午夜| 国产精品91一区| 亚洲精品成人av| 久久综合伊人77777蜜臀| 久久av中文字幕| 国产日产欧美a一级在线| 91大神在线播放精品| 91高清视频免费观看| 欧美国产日韩在线| 欧美激情在线一区| 欧美日韩亚洲天堂| 一区二区日韩精品| 丁香五六月婷婷久久激情| 欧美乱妇高清无乱码| 精品国产乱码久久久久酒店| 久久综合国产精品台湾中文娱乐网| 欧美性xxxxxx| 精品国产依人香蕉在线精品| 日韩国产在线播放| 中文国产成人精品久久一| 欧美最顶级丰满的aⅴ艳星| 日韩av在线网址| 欧美黑人极品猛少妇色xxxxx| 国产一区二区三区直播精品电影| 欧美国产日产韩国视频| 亚洲第一中文字幕| 日韩视频中文字幕| 久久久久久久久亚洲| 色老头一区二区三区在线观看| 欧美高清性猛交| 国产精品免费一区| 欧美日韩亚洲精品一区二区三区| 久久久久久久久久久国产| 亚洲新中文字幕| 国产亚洲一区二区在线| 亚洲第一中文字幕| 国产精品av电影| 日韩电影第一页| 久久久久久国产精品美女| 亚洲精品小视频在线观看| 日韩在线视频线视频免费网站| 亚洲精品永久免费| 精品久久久精品| 亚洲bt欧美bt日本bt| 亚洲最新av网址| 福利视频第一区| 欧美日韩免费区域视频在线观看| 亚洲国产高潮在线观看| 国产在线观看不卡| 国产成人拍精品视频午夜网站| 久久久久久久久国产精品| 亚洲人成亚洲人成在线观看| 欧美多人乱p欧美4p久久| 日本高清不卡在线| 国产aaa精品| 91精品久久久久久久久不口人| 国产午夜精品免费一区二区三区| 欧美日韩一区二区在线播放| 国产欧美在线视频| 一本大道久久加勒比香蕉| 中文字幕在线看视频国产欧美| 国产精品精品久久久久久| 91精品成人久久| 日本免费久久高清视频| 国产精品天天狠天天看| 性欧美长视频免费观看不卡| 亚洲嫩模很污视频| 91日本在线观看| 欧美老女人www| 日韩电影在线观看永久视频免费网站| 亚洲国产欧美一区二区丝袜黑人| 亚洲视频网站在线观看| 亚洲男人的天堂在线播放| 日韩av高清不卡| 亚洲欧美制服另类日韩| 亚洲色在线视频| 亚洲视频在线观看免费| 国产九九精品视频| 欧美大片va欧美在线播放| 亚洲视频电影图片偷拍一区| 亚洲精品电影久久久| 日韩国产欧美区| 欧美电影第一页| 亚洲а∨天堂久久精品9966| 亚洲成年人在线| 国产精品中文久久久久久久| 国产精品一区久久| 国产亚洲日本欧美韩国| 国产精品精品视频一区二区三区|