2011-01-12 39 views
1

今天在工作中,我不得不查看一个类似于这个模拟例子的代码片段。终于在例外情况下嵌套的行为

package test;

import java.io.IOException; 
import org.apache.log4j.Logger; 

public class ExceptionTester { 

    public static Logger logger = Logger.getLogger(ExceptionTester.class); 

public void test() throws IOException { 
    new IOException(); 
} 

public static void main(String[] args) { 
    ExceptionTester comparator = new ExceptionTester(); 
    try { 
     try { 
      comparator.test(); 
     } finally { 
      System.out.println("Finally 1"); 
     } 
    } catch(IOException ex) { 
     logger.error("Exception happened" ex); 
      // also close opened resources 
    } 
    System.out.println("Exiting out of the program"); 
} 

}

它打印以下output.I预期的编译错误,因为内try没有一个catch块。

 
Finally 1 
Exiting out of the program 

我不明白为什么IOException由外catch块捕获。我将不胜感激,如果任何人都可以解释这一点,尤其是通过引用堆栈展开过程

+4

`try`必须有> = 1`catch` __和/或``finally`。 'catch'不是必需的。 – dkarp 2011-01-12 03:12:16

回答

6

finally块表示在正常和异常条件下都必须完成的任务。

示例:您将面试候选人带到午餐。在午餐时,你会发现他被谋杀的警察通缉。例外!午餐结束了,面试完全失败,但是......你还得付午餐费。

try { 
    meetForLunch(interviewCandidate); 
} 
finally { 
    lunchBill.pay(); 
} 

请注意,午餐付款没有考虑到例外情况,您仍然必须在面试时对凶手做点事情。这只是一个松散的结局,必须在处理损坏控制之前加以照顾。

块以这种方式使用的大多数最后:一个文件需要被关闭是否成功保存的数据;一个数据库连接需要关闭该交易是否被批准与否等

而且该异常继续以其快捷方式向外寻找在封闭范围内匹配的catch块。

请注意,finally块将始终运行,除非该进程在try块仍在执行时结束。

+0

当然,如果候选人在午餐中谋杀你,这个比喻就会失效。 :-) – 2011-01-12 03:16:06

0

我认为问题是,你的功能

public void test() throws IOException { 
    new IOException(); 
} 

实际上并没有引发异常 - 它只是创建一个新的IOException异常()目的。将其更改为

public void test() throws IOException { 
    throw new IOException(); 
} 

应该解决这个问题。

+1

这就是为什么“异常发生”没有被打印出来,但它对`finally`块没有影响。 – 2011-01-12 03:04:08

0

以上代码不需要太多的解释 - 不一定涉及调用堆栈!你有什么困惑?我错过了什么? 这里是我的解释

第一点

  • 你不需要既是渔获物和一个 finally块。你可以使用 其中一个 或者他们两个都带有一个 尝试块,但不是都不是。
  • 即使从 try或catch块中抛出 异常,finally子句 中的代码也将始终执行。如果您的代码在try或 catch块中有返回语句 ,则在从方法返回之前,finally块中的代码将执行 。

所以在上面的代码中,一个异常从未抛出(因为你是不是在test()方法使用throw) 然而,finally块得到执行由语言规范的承诺和你有输出Finally 1。执行顺序中的下一个语句是System.out.println("Exiting out of the program");,因为catch块永远不会到达,因为没有IOException。所以,打印Exiting out of the program

相关问题