WEB开发网      婵犵數濞€濞佳囧磹婵犳艾鐤炬い鎰堕檮閸嬬喐銇勯弽銊с€掗梻鍕閺岋箑螣娓氼垱笑闂佽姘﹂褔婀佸┑鐘诧工妤犲憡绂嶉崜褏纾奸弶鍫涘妼缁楁岸鏌熷畡鐗堝殗闁诡喒鏅犲畷褰掝敃閵堝棙顔忔繝鐢靛仦閸ㄥ爼骞愰幘顔肩;闁规崘绉ぐ鎺撳亹闁绘垶锕╁Λ鍕⒑閹肩偛濡奸悗娑掓櫇缁顓兼径妯绘櫇闂佹寧绻傞弻濠囨晝閸屾稓鍘甸柣搴㈢⊕閿氶柣蹇ョ稻缁绘繃绻濋崘銊т紝闂佽鍨伴崯鏉戠暦閻旂⒈鏁傞柛鈾€鏅欑槐妯衡攽閻愬樊鍤熷┑顔藉劤铻為柛鏇ㄥ墯閸欏繘鏌嶉崫鍕櫣缂佲偓婢跺绠鹃柟瀛樼箘閿涘秵顨ラ悙顏勭伈闁诡喖缍婂畷鎯邦槻婵℃彃顭烽弻娑㈠Ω閵夈儺鍔夌紓浣稿€哥粔褰掑极閹剧粯鏅搁柨鐕傛嫹 ---闂傚倷鐒︾€笛兠洪埡鍛闁跨噦鎷�
开发学院WEB开发Jsp 用finally做什么 阅读

用finally做什么

 2008-01-05 09:55:14 来源:WEB开发网 闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹闂傚倷绀侀幉锟犲垂閻㈠灚宕查柟鎵閸庡秵銇勯幒鎴濃偓鐢稿磻閹炬枼妲堟繛鍡楃С濞岊亞绱撻崒姘扁枌闁瑰嚖鎷�婵犵數濮幏鍐川椤撴繄鎹曢梻渚€娼уú銈吤洪妸鈺佺劦妞ゆ帊鑳堕埊鏇㈡煏閸モ晛浠х紒杈╁仱閺佹捇鏁撻敓锟�闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹  闂傚倷鑳舵灙缂佺粯顨呴埢宥夊即閵忕姵鐎梺缁樺姈椤愮厧鈽夊Ο閿嬬€婚梺褰掑亰閸撴稑鈻斿鑸碘拺闁告稑饪村▓鏃€绻涚仦鍌氬闁崇粯鎹囬獮瀣攽閹邦剚顔傛俊鐐€栧濠氬储瑜忛幉鎾晸閿燂拷
核心提示:在没有“垃圾收集”以及“自动调用破坏器”机制的一种语言中(注释⑤),finally显得非凡重要,用finally做什么,因为程序员可用它担保内存的正确释放——无论在try块内部发生了什么状况,但java提供了垃圾收集机制,请注重,与作上标签的break和continue一道,所以内存的释放几乎绝对不会成为问题,另外

  在没有“垃圾收集”以及“自动调用破坏器”机制的一种语言中(注释⑤),finally显得非凡重要,因为程序员可用它担保内存的正确释放——无论在try块内部发生了什么状况。但java提供了垃圾收集机制,所以内存的释放几乎绝对不会成为问题。另外,它也没有构建器可供调用。既然如此,Java里何时才会用到finally呢?
  
  ⑤:“破坏器”(DestrUCtor)是“构建器”(Constructor)的反义词。它代表一个非凡的函数,一旦某个对象失去用处,通常就会调用它。我们肯定知道在哪里以及何时调用破坏器。C++提供了自动的破坏器调用机制,但Delphi的Object Pascal版本1及2却不具备这一能力(在这种语言中,破坏器的含义与用法都发生了变化)。
  
  除将内存设回原始状态以外,若要设置另一些东西,finally就是必需的。例如,我们有时需要打开一个文件或者建立一个网络连接,或者在屏幕上画一些东西,甚至设置外部世界的一个开关,等等。如下例所示:
  
  //: OnOffSwitch.java
  // Why use finally?
  
  class Switch {
   boolean state = false;
   boolean read() { return state; }
   void on() { state = true; }
   void off() { state = false; }
  }
  
  public class OnOffSwitch {
   static Switch sw = new Switch();
   public static void main(String[] args) {
    try {
     sw.on();
     // Code that can throw exceptions...
     sw.off();
    } catch(NullPointerException e) {
     System.out.PRintln("NullPointerException");
     sw.off();
    } catch(IllegalArgumentException e) {
     System.out.println("IOException");
     sw.off();
    }
   }
  } ///:~
  
  这里的目标是保证main()完成时开关处于关闭状态,所以将sw.off()置于try块以及每个违例控制器的末尾。但产生的一个违例有可能不是在这里捕捉的,这便会错过sw.off()。然而,利用finally,我们可以将来自try块的关闭代码只置于一个地方:
  
  //: WithFinally.java
  // Finally Guarantees cleanup
  
  class Switch2 {
   boolean state = false;
   boolean read() { return state; }
   void on() { state = true; }
   void off() { state = false; }
  }
  
  public class WithFinally {
   static Switch2 sw = new Switch2();
   public static void main(String[] args) {
    try {
     sw.on();
     // Code that can throw exceptions...
    } catch(NullPointerException e) {
     System.out.println("NullPointerException");
    } catch(IllegalArgumentException e) {
     System.out.println("IOException");
    } finally {
     sw.off();
    }
   }
  } ///:~
  
  在这儿,sw.off()已移至一个地方。无论发生什么事情,都肯定会运行它。
  即使违例不在当前的catch从句集里捕捉,finally都会在违例控制机制转到更高级别搜索一个控制器之前得以执行。如下所示:
  
  //: AlwaysFinally.java
  // Finally is always executed
  
  class Ex extends Exception {}
  
  public class AlwaysFinally {
   public static void main(String[] args) {
    System.out.println(
     "Entering first try block");
    try {
     System.out.println(
      "Entering second try block");
     try {
      throw new Ex();
     } finally {
      System.out.println(
       "finally in 2nd try block");
     }
    } catch(Ex e) {
     System.out.println(
      "Caught Ex in first try block");
    } finally {
     System.out.println(
      "finally in 1st try block");
    }
   }
  } ///:~
  
  该程序的输出展示了具体发生的事情:
  
  Entering first try block
  Entering second try block
  finally in 2nd try block
  Caught Ex in first try block
  finally in 1st try block
  
  若调用了break和continue语句,finally语句也会得以执行。请注重,与作上标签的break和continue一道,finally排除了Java对goto跳转语句的需求。

Tags:finally 什么

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接