用finally做什么
当前位置:以往代写 > JAVA 教程 >用finally做什么
2019-06-14

用finally做什么

用finally做什么

在没有“垃圾收集”以及“自动挪用粉碎器”机制的一种语言中(注释⑤),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跳转语句的需求。

    关键字:

在线提交作业