要执行!即便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
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 executedpublic 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代码执行是否有异常
public class throwsException1
{
public static void main(String args[])
{
try
{
Method(0);
Method(1);
}
catch(NumberFormatException e)
{ System.out.println("\t捕获异常:"+e);}
catch(ArrayIndexOutOfBoundsException e)
{ System.out.println("\t捕获异常:"+e);}
finally
{ System.out.println("finally 块总是被执行。"); }
}
static void Method(int i)
{
System.out.println("调用方法Method("+i+")");
if(i==0)
{
System.out.println("\t没有异常.");
return;
}
else if(i==1)
{
String str="xyz";
int c;
c=Integer.parseInt(str);
}
}
}
运行的结果是:
调用方法Method(0)
没有异常
调用方法Method(1)
捕获异常:java.lang.NumberFormatException :xyz
finally 块总是被执行而不是
调用方法Method(0)
没有异常
finally 块总是被执行
调用方法Method(1)
捕获异常:java.lang.NumberFormatException :xyz
finally 块总是被执行
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程序设计》:人民邮电出版社
try
……
catch
……
finally
……
而且只出现一个异常。
而我的上例中是3个
try……catch……finally……
2个异常