当前位置: 技术问答>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
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从句都会执行。
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代码执行是否有异常
|
try catch finally 是一个完整的异常处理,try 扑佐异常,catch处理异常,而finally是无论是否发生异常,都要执行的代码,可以在他的里面写一些关闭数据库连接,之类的释放资源的语句或是写些无论是否发生异常,都要执行的语句。
|
你问这个问题,还不如动手试一下。呵呵
|
alphazhao(绿色咖啡)
说的很全,考下来试一下
说的很全,考下来试一下
|
当然
|
因为
try{
}
还没执行完呀,执行完try块才执行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程序设计》:人民邮电出版社
//测试代码:
//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个异常
因为这里只有一个
try
……
catch
……
finally
……
而且只出现一个异常。
而我的上例中是3个
try……catch……finally……
2个异常
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。