try catch finally与return的执行顺序

[color=red] [size=medium]1.不管有无异常,finally里的语句都会执行
(通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等 )
2.当try 或catch 块里有return语句时,finally仍会执行
3.finally语句里不能包含return语句(实践证明可以包含,但是需要加上@SuppressWarnings("finally"),当包含return时候,程序会到此为止,不再往下执行)
4.finally在return(不论是try或catch里的return)前执行,即执行finally,不会改变已经确定的return值 (即执行finally后再执行try或catch里的语句,return返回语句不受finally影响,感官上是return前好像没有执行finally).


[/size]
[/color]

[b]代码一[/b]
import java.io.*;
public class Mine{
public static void main(String argv[]){
Mine m=new Mine();
System.out.println(m.amethod());
}
public int amethod(){
try{
FileInputStream dis =new FileInputStream("Hello.txt");[color=red] //1,抛出异常[/color]
}catch ( Exception ex) {
System.out.println("No such file found"); [color=red]//2.catch捕获异常,并执行[/color]
return -1; [color=red]//4,return 返回[/color]
}finally{
System.out.println("Doing finally"); [color=red]//3.finally一定会执行,在return之前。[/color]
}
return 0;
}
}


运行结果:

C:\java>java Mine
No such file found
Doing finally
-1

运行顺序是1.2.3.4

[color=red]如果在finnally写入return,则程序到此终止,不在执行4即是不在返回-1[/color]

[b]
代码二[/b]
public class Test {
int a;

public int amethod() {
try {
System.out.println("mmmm");//1.此处没有异常,所以不再走catch,
return a; //3.return返回0
} catch (Exception ex) {
return a;
} finally {
a++;
System.out.println(a); // 2.finally一定会执行,在return之前。此处输出1
}

}

public static void main(String argv[]) {
Test m = new Test();
System.out.println(m.amethod());
}
}



运行结果:
mmmm
1
0

[color=red]finally 块会在return之前执行[/color]

[b]代码三:[/b]
try{
System.out.println("hello world");
System.exit(0);
}catch(RuntimeException e){
e.printStackTrace();
}finally{
System.out.println("goodbye world");
}



输出结果: hello world
finally 块不会被执行

如果用[color=red]System.exit(0);这个是系统强制退出[/color],没辙,肯定会退出去,不会执行下面的finally
API文档上描述System.exit方法会导致当前运行线程停止并使其它线程都终止,因此上面这段代码中的finally代码块不会被执行

进一步探索System.exit被调用后的行为,它在虚拟机退出之前会执行两个清除任务。第一,它会执行所有通过Runtime.addShutdownHook注册的shutdown hooks它能有效的释放JVM之外的资源。第二,执行清除任务,运行相关的finalize方法终结对象。

如果需要在调用System.exit方法后仍然打印出“goodbye world”,可采用如下方法

 try {
System.out.println("Hello World");
Runtime.getRuntime().addShutdownHook(
new Thread(){
public void run(){
System.out.println("Goodbye World");
}
}
);
System.exit(0);
} catch (RuntimeException e) {
e.printStackTrace();
}finally{
System.out.println("Goodbye World");
}



[color=red]try 要么和catch一起,要么和finaly一起,不能独立使用,例如
try{
System.out.println(33);
}
这样写是不对的。[/color]


最后还应该注意一下异常处理的语法规则:

  [color=blue]第一、try语句不能单独存在,可以和catch、finally组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个,try、catch、finally这三个关键字均不能单独使用。

  第二、try、catch、finally三个代码块中变量的作用域分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。

  第三、多个catch块时候,Java虚拟机会匹配其中一个异常类或其子类,就执行这个catch块,而不会再执行别的catch块。

  第四、throw语句后不允许有紧跟其他语句,因为这些没有机会执行。[/color]

第五、如果一个方法调用了另外一个声明抛出异常的方法,那么这个方法要么处理异常,要么声明抛出。(第五点不是很懂)

[b]Java异常处理的原则和技巧[/b]
  1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。

  2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。

  3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。

  4、不要把自己能处理的异常抛给别人。

  5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况


下面这篇博客总结的也不错
http://www.blogjava.net/fancydeepin/archive/2012/07/08/java_try-catch-finally.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值