`
peonyzzdx
  • 浏览: 580846 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

try catch finally与return的执行顺序

阅读更多
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).





代码一
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

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


代码二

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

finally 块会在return之前执行

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



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

如果用System.exit(0);这个是系统强制退出,没辙,肯定会退出去,不会执行下面的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");
       }





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



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

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

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

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

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


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

Java异常处理的原则和技巧
  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
分享到:
评论
1 楼 Frank_Sun 2013-09-09  
我的jdk版本是1.6.0.29,在finally中加return时,不加加上@SuppressWarnings("finally")程序也能执行。

相关推荐

    try、catch、finally、return 执行顺序.doc

    try、catch、finally、return 执行顺序超详细讲解,包看包会。

    try-catch-finally执行顺序验证

    try-catch-finally执行顺序验证(左边是.java文件,右边是.class文件) 提示: try、catch块内的return操作编译后会变成把return的值保存到变量var的操作。 总结: try、catch块内的return操作编译后会变成把return的值...

    Jungle68#-#[Java] try catch finally,try里有return,finally还执行么?1

    Condition 3: try中有异常,try-catch-finally里都没有return ,finally 之后有个returntry中有异常以后,根据

    try~catch~finally中关于return的问题

    在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视

    try catch finally的执行顺序深入分析

    首先执行try,如果有异常执行catch,无论如何都会执行finally,当有return以后,函数就会把这个数据存储在某个位置,然后告诉主函数,我不执行了,接下来你执行吧,所以函数就会推出

    关于Java中的try-catch-finally语句和return

    第一:return语句并不是函数的终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)  第二:finally里面不建议放return语句,根据需要,return语句...

    try-catch-finally-return-in-finally.rar_return

    The production IfStatement : if ( Expression ) Statement else Statement is evaluated as follows:.

    Java中finally块执行与return关系深度剖析

    Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。

    谈谈Java中try-catch-finally中的return语句

    我们知道return语句用在某一个方法中,一是用于返回函数的执行结果,二是用于返回值为void类型的函数中,仅仅是一个return语句(return ;),此时用于结束方法的执行,也即此return后的语句将不会被执行,当然,这种...

    java大厂面经、直击BAT

    finally 一定会被执行,如果 finally 里有 return 语句,则覆盖 try/catch 里的 return , 比较爱考的是 finally 里没有 return 语句,这时虽然 finally 里对 return 的值进行了修改,但 return 的值并不改变这种...

    josonle#Coding-Now#finally语句如何执行1

    - 无论try是否发生异常,finally语句都会执行- 如果try/catch中包含控制转移语句(return、continue、break),finally

    trycatchfinaly

    3. 但是如果有 finally块的话,那么,finally 几乎是必定会执行的,但是这里有一个先后顺序的问题,应该是 finally 块和 打印异常堆栈将会在另外一个线程之中执行,所以 打印的顺序就很有意思了。 4. 如果在try或者...

    java面试题之try中含return语句时代码的执行顺序详解

    主要介绍了关于java中的一道面试题,这套题就是在try中含return语句时代码的执行顺序,这个问题看似简单,却暗藏杀机啊!文中通过一个个例子详细介绍了其中玄机,需要的朋友可以参考学习,下面来一起看看吧。

    VB.Net常用语法

    在一个try………end try 过程中可以使用catch与finally两个中的一 个,或者两个一起用, 二:Protected, private, Public 封装控制 这三个关键字一般放在语句最前面,而会置于overloads与Overrides的 后面...

    finally 一定会执行(实例代码)

    @SuppressWarnings(finally) static int compute (){ Exc e = new Exc(); e.a = 10; e.b = 10; int res = 0 ; try{ res = e.a / e.b; System.out.println(try ……); return res + 1; }catch...

    浅谈Python中的异常和JSON读写数据的实现

    异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try … catch … finally来处理异常,在Python中通过try … except … else来处理异常 一、以ZeroDivisionError为例,处理分母为...

    java实验2实验报告.doc

    实验指导书 实验名称:包、接口与异常处理 学时安排:2 实验类别:综合设计型实验 实验要求:1人1组  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 一、实验目的 1、掌握java字符串处理...

    毕业就业-刷题库Java面试题大全(2021年-2022年).rar

    8. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 9. 类 ExampleA 继承 Exception,类 ExampleB 继承ExampleA。 10. 常见的 RuntimeException 有哪些? 11. Java常见异常有哪些 四、并发...

    asp.net 系统

    ublic SqlConnection lianjie()//数据库链接 { ... try { com.ExecuteNonQuery();//执行sql命令 return true; } catch { return false; } finally { con.Close();//关闭数据库 }

    AST反混淆js还原工具2.3(20231219)

    03 try-catch优化为try-catch-finally简化 04 辅助功能-return简写表达式还原,便于阅读理解 05 新增:大数组多解密函数(需要先自行排版,大数组-偏移函数-解密函数1-解密函数2-解密函数3) 06 修复bug-未修改常量...

Global site tag (gtag.js) - Google Analytics