当前位置:  技术问答>java相关

由try-catch-finally语句捕获异常时,是否finally所指定的代码都要被执行?即使try语句所指定的不产生异常?

    来源: 互联网  发布时间:2015-07-17

    本文导语:  如题 | 要执行!即便try 语句不产生异常。 public class test{   public static void main(String[] args){     System.out.println("0");     try{       System.out.println("1");     }     catch(Exception e)   ...

如题

|
要执行!即便try 语句不产生异常。
public class test{
  public static void main(String[] args){
    System.out.println("0");
    try{
      System.out.println("1");
    }
    catch(Exception e)
    {
      System.out.println("2");
    }
    finally{
      System.out.println("3");
    }
  }
}
结果为
0
1
3

|
是的
Thinking in java书中如是说:
用finally清除
无论一个违例是否在try块中发生,我们经常都想执行一些特定的代码。对一些特定的操作,经常都会遇到这种情况,但在恢复内存时一般都不需要(因为垃圾收集器会自动照料一切)。为达到这个目的,可在所有违例控制器的末尾使用一个finally从句(注释④)。所以完整的违例控制小节象下面这个样子:

try {
// 要保卫的区域:
// 可能“掷”出A,B,或C的危险情况
} catch (A a1) {
// 控制器 A
} catch (B b1) {
// 控制器 B
} catch (C c1) {
// 控制器 C
} finally {
// 每次都会发生的情况
}

④:C++违例控制未提供finally从句,因为它依赖构建器来达到这种清除效果。

为演示finally从句,请试验下面这个程序:

//: FinallyWorks.java
// The finally clause is always executed

public class FinallyWorks {
  static int count = 0;
  public static void main(String[] args) {
    while(true) {
      try {
        // post-increment is zero first time:
        if(count++ == 0)
          throw new Exception();
        System.out.println("No exception");
      } catch(Exception e) {
        System.out.println("Exception thrown");
      } finally {
        System.out.println("in finally clause");
        if(count == 2) break; // out of "while"
      }
    }
  }
} ///:~

通过该程序,我们亦可知道如何应付Java违例(类似C++的违例)不允许我们恢复至违例产生地方的这一事实。若将自己的try块置入一个循环内,就可建立一个条件,它必须在继续程序之前满足。亦可添加一个static计数器或者另一些设备,允许循环在放弃以前尝试数种不同的方法。这样一来,我们的程序可以变得更加“健壮”。
输出如下:

Exception thrown
in finally clause
No exception
in finally clause

无论是否“掷”出一个违例,finally从句都会执行。

|
一般用来处理一些无用的对象,释放资源
无论try代码执行是否有异常

|
try catch finally 是一个完整的异常处理,try 扑佐异常,catch处理异常,而finally是无论是否发生异常,都要执行的代码,可以在他的里面写一些关闭数据库连接,之类的释放资源的语句或是写些无论是否发生异常,都要执行的语句。

|
你问这个问题,还不如动手试一下。呵呵

|
alphazhao(绿色咖啡) 

说的很全,考下来试一下

|
当然

|
因为
   try{
      }
  
还没执行完呀,执行完try块才执行finally

|
//执行的。

//测试代码:
//TryCatchFinally.java
public class TryCatchFinally
{
  public static void main(String args[])
  {
    Method(0);
    Method(1);
    Method(2);
  }

  static vod Method(int a)
  {
    System.out.println("调用方法 Method("+a+")");
    try
     {
       if(a==0)
       {
         System.out.println("t没有异常产生,正常退出。");
         return;
       }
       else if(a==1)
       {
         int i=0;
         int j=4/i;
       }
       else if(a==2)
       {
         int iArray[]=new int[4];
         iArray[4]=3;
       }
    }

    catch(ArithmeticException e)
    {
       System.out.println("t捕获异常: "+e);
    }
    catch(ArrayIndexOutOfBoundsException e)
    {
       System.out.println("t捕获异常: "+e.getMessage());
    }
    catch(Exception e)
    {
       System.out.println("t产生的异常已被处理,该catch块不会被执行。");
    }
    finally
    {
       System.out.println("tfinally块总是被执行。");
    }
  }
}

//结果输出:
/*
调用方法Method(0)
    没有异常产生,正常退出。
    finally块总是被执行。
调用方法Method(1)
    捕获异常:java.lang.ArithmeticException:/by zero
    finally块总是被执行。
调用方法Method(2)
    捕获异常:null
    finally块总是被执行。
*/

//摘自《Java程序设计》:人民邮电出版社

|
TO:gscool(炮灰)

因为这里只有一个
try
……
catch
……
finally
……
而且只出现一个异常。
而我的上例中是3个
try……catch……finally……
2个异常

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3