精华内容
下载资源
问答
  • 1、在java里函数抛出异常是需要在...函数会运算完所有执行的代码,包括return里面的表达式,只是在return操作前去执行finally里面的代码。实例如下面的代码:public class Test{public int add(int a,int b){try {re...

    1、在java里函数抛出异常是需要在函数上定义的,除了runtimeException外

    2、java中finally运行的位置在函数return前,其他的代码后。函数会运算完所有执行的代码,包括return里面的表达式,只是在return操作前去执行finally里面的代码。实例如下面的代码:

    public class Test{

    public int add(int a,int b){

    try {

    return a+b;

    }

    catch (Exception e) {

    System.out.println("catch语句块");

    }

    finally{

    System.out.println("finally语句块");

    }

    return 0;

    }

    public static void main(String argv[]){

    Test test =new Test();

    System.out.println("和是:"+test.add(9, 34));

    }

    }

    运行的结果为:

    finally语句块

    和是:43

    展开全文
  • 返回函数调用处综合①②finally代码会在return前执行即程序在执行到return时会首先将返回值存储在一个指定的位置,其次去执行finally块,再返回。public static int testFinally(){try{return 1;}catch(Exception e)...

    一、finally代码在return前执行

    ①finally代码一定会执行

    ②return表示退出函数体,返回函数调用处

    综合①②finally代码会在return前执行

    即程序在执行到return时会首先将返回值存储在一个指定的位置,其次去执行finally块,再返回。

    public static int testFinally()

    {

    try{

    return 1;

    }catch(Exception e)

    {

    return 0;

    }finally{

    System.out.println("execute finally");

    }

    }

    //execute finally

    1

    二、如果try-finally或者catch-finally中都有return,那么finally块中的return语句将会覆盖别处的return语句,最终但会到调用者哪里的是finally中的return的值。

    public static int testFinally()

    {

    try{

    return 1;

    }catch(Exception e)

    {

    return 0;

    }finally{

    System.out.println("execute finally");

    return 3;

    }

    }

    //执行结果:

    execute finally

    3

    三、return基本数据类型和引用类型

    对于基本数据类型,在finally块中改变return的值对返回值没有任何影响,而对引用类型的数据会有影响。

    (由于在一个方法内部定义的变量都存储在栈中,当这个函数结束后,其对应的栈就会被回收,此时在其方法体中定义的变量就不存在了,因此return在返回时不是直接返回变量的值,而是复制一份,然后返回)

    public static int testFinally()

    {

    int result=1;

    try{

    result=2;

    return result;

    }catch(Exception e)

    {

    return 0;

    }finally{

    result=3;

    System.out.println("execute finally");

    //return 4; 若这里写return,则返回的结果为4(因为finally中的return会覆盖其他部分的return)

    //若不写return,则返回的结果为2,(因为finally执行完,再到try中return )

    }

    }

    在方法testFinally1中调用return前,先将result的值1存储在一个指定位置,然后再去执行finally块中的代码,此时修改result的值将不会影响到程序的返回结果。

    public static StringBuffer testFinally()

    {

    StringBuffer s=new StringBuffer("hello");

    try{

    return s;

    }catch(Exception e)

    {

    return null;

    }finally{

    s.append(" world");

    System.out.println("execute finally");

    }

    }

    //输出:

    execute finally

    hello world

    testFinally2中,在调用return前首先把s存储到一个指定的位置,由于s为引用类型,s存储的是对象的地址,因此在finally块中修改s将会修改程序的返回结果。

    四、在java程序中的finally块不一定会被执行

    ①在进入try之前就出异常

    public static void testFinally()

    {

    int i=5/0;

    try{

    System.out.println("try block");

    }catch(Exception e)

    {

    System.out.println("try block");

    }finally{

    System.out.println("try block");

    }

    }

    //会报java.lang.ArithmeticException: / by zero 异常,之后代码不会执行

    ②try块中强制退出System.exit(0);

    展开全文
  • 只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行finally 相对应的 try 语句块之前,已经抛出错误,或者已经返回,return,就不会执行finally2.当与 finally 相对应的 try 语句块中有...

    一、finally是否执行:

    1.只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行

    当finally 相对应的 try 语句块之前,已经抛出错误,或者已经返回,return,就不会执行finally

    2.当与 finally 相对应的 try 语句块中有 System.exit(int status) ,并且顺利执行,finally 语句块也不会执行

    System.exit(int status) 会终止 Java 虚拟机的运行

    类似的情况还有:线程被中断,interrupted,进程被终止,killed,死机、断电等

    二、finally何时执行:

    1.Java 虚拟机会把 finally 语句块作为 subroutine 直接插入到 try 语句块或者 catch 语句块的控制转移语句之前。

    控制转移语句:return、throw 和 break、continue

    2.对于有返回值的 return 和 throw 语句,在执行 subroutine 之前,try 或者 catch 语句块会保留其返回值到本地变量表(Local Variable Table)中。

    待 subroutine 执行完毕之后,再恢复保留的返回值到操作数栈中,然后通过 return 或者 throw 语句将其返回给该方法的调用者(invoker)。

    8f900a89c6347c561fdf2122f13be562.png

    961ddebeb323a10fe0623af514929fc1.png

    1 public classTest {2

    3 public static voidmain(String[] args) {4 System.out.println(testFinally());5 }6

    7 public static inttestFinally() {8 int i = 1;9 //if(i == 1)10 //return 0;

    11 System.out.println("before try");12 i = i / 0;13 try{14 System.out.println("try");15 //System.exit(0);

    16 returni;17 } finally{18 System.out.println("finally");19 }20 }21 }

    例子1

    8f900a89c6347c561fdf2122f13be562.png

    961ddebeb323a10fe0623af514929fc1.png

    1 public classTest {2

    3 public static voidmain(String[] args) {4 System.out.print(testFinally());5 }6

    7 public static inttestFinally() {8 int b = 10;9 try{10 System.out.println("try");11 return b += 20;12 } catch(Exception e) {13 System.out.println("error:" +e);14 } finally{15 System.out.println("finally");16 System.out.println("b:" +b);17 b = 50;18 System.out.println("b:" +b);19 }20 return 40;21 }22 }

    例子2

    展开全文
  • 示例1:public static String hello() {String s = "商务";try {return s;...} finally {s = "你好世界";return s;}}返回结果:你好世界,此时的返回顺序是 finally > try示例2:public static String he...

    示例1:

    public static String hello() {

    String s = "商务";

    try {

    return s;

    } catch (Exception e) {

    return "catch进来了";

    } finally {

    s = "你好世界";

    return s;

    }

    }

    返回结果:你好世界,此时的返回顺序是 finally > try

    示例2:

    public static String hello() {

    String s = "商务";

    try {

    return s;

    } catch (Exception e) {

    return "catch进来了";

    } finally {

    s = "你好世界";

    }

    }

    返回结果:商务

    因为在 try 处会进行 s 值的缓存

    示例3:

    public static void hehe() {

    int a = 10;

    try {

    a += 1;

    System.out.println(a);

    throw new Exception("catch测试");

    } catch (Exception e) {

    e.printStackTrace();

    a += 10;

    System.out.println(a);

    } finally {

    a += 10000;

    System.out.println(a);

    }

    System.out.println(a);

    }

    返回结果:

    11

    21

    10021

    10021

    故意在 try 处抛出一个异常进入 catch,此时返回的顺序是 try > catch > finally > 最后一行代码

    补充知识:Java异常获取中try-catch-finally块执行顺序

    最近看面试题,发现这个比较好玩,try-catch-finally块的执行顺序问题。

    一般认为,finally最后执行,做收尾工作,无论try块是否捕获异常,最后finally都会工作。但是这样还是比较笼统,如果没有catch,而是将异常抛出,让其他方法处理,那么是先进入其他方法还是先执行finally?如果try块中return了,那么finally还执行不执行?进一步,如果try、finally全部有return,那么执行是怎样的过程?

    确实,异常这些还是最早学Java的时候学的,当时似乎也没考虑这么多。借此机会研究一下异常获取的顺序。

    节省时间,直接结论:

    try->catch->finally按顺序执行,不管是否有异常,不管try中有什么操作,就算是return,也得往后稍稍,最后这个方法一定是要执行finally。

    如果try中抛出异常,而异常是留给上层方法处理,那么在抛出后,仍然运行finally,然后再回溯到上层。

    自然,如果try中有return――也算是回溯了,返回值会存在栈中等待,等finally运行之后再回溯。

    而如果finally中有return,那么直接从finally中结束方法。

    如果在方法中直接结束程序,即调用System.exit()方法,那么就直接结束了,此时finally是不执行的。由此可以认为,特殊情况导致程序的退出是可能导致一些问题的。毕竟finally一般写的是关闭对象、资源的代码。

    通过代码分析:

    先写了一个包含情况比较多的例子:

    package me.iwts;

    public class Main{

    public static int rank;

    public static void solve1() throws Exception{

    try {

    System.out.println("solve 1 try,rank: "+rank++);

    throw new Exception("throw by solve 1");

    }finally {

    System.out.println("solve 1 finally,rank: "+rank++);

    }

    }

    public static void solve2(){

    try{

    System.out.println("solve 2 try,rank: "+rank++);

    solve1();

    }catch (Exception ex){

    System.out.println("catch exception : "+ex.getMessage()+",rank: "+rank++);

    }finally {

    System.out.println("solve 1 finally,rank: "+rank++);

    }

    }

    public static void main(String args[]) {

    rank = 1;

    solve2();

    System.out.println("over");

    }

    }

    rank是计数。可以看到,整体上是先调用solve2方法,在其中调用solve1,solve1抛出了一个异常,让solve2捕获处理。大家可以先自己猜一下。

    下面是返回答案:

    solve 2 try,rank: 1

    solve 1 try,rank: 2

    solve 1 finally,rank: 3

    catch exception : throw by solve 1,rank: 4

    solve 1 finally,rank: 5

    over

    根据上面的结果可以分析:try-catch-finally执行顺序:首先是try执行,如果发生异常,那么直接捕获异常,最后执行finally。但是,如果抛出异常,例如在solve1方法中,throw了一个异常,那么不会立刻回溯到上一个方法,而是仍然执行finally。

    通过solve1的执行,我们可以认为,finally之前的所有代码,正常执行,但是返回之类的,全部被“卡”了下来,只有在finally执行之后,才能继续执行。

    这里就又有疑惑了,一般认为throw了一个异常,就算是回溯了,为什么finally仍然执行了?如果这个不够明显,那么再看这个代码:

    package me.iwts;

    public class Main{

    public static int solve(){

    try{

    System.out.println("try");

    return 1;

    }finally {

    System.out.println("finally");

    return 2;

    }

    }

    public static void main(String args[]) {

    System.out.println(solve());

    }

    }

    返回值是多少?

    try

    finally

    2

    try块都已经return了,最后为什么是返回的return2?并且try块确实是运行了。再改一下代码:

    package me.iwts;

    public class Main{

    public static int solve(){

    int i = 1;

    try{

    System.out.println("try");

    return i++;

    }finally {

    System.out.println("finally");

    return i;

    }

    }

    public static void main(String args[]) {

    System.out.println(solve());

    }

    }

    注意,try块返回了i++,那么我们debug就能看出来return这句到底是执行还是没执行,那么有这样的图:

    6594394a84f7456c9cef60b1b30ef9ca.png

    可以看到,return确实是执行的。

    所以,认为finally是无论怎样一定在方法的最后结束前执行的。搜了一些资料,是说finally会在方法结束之前执行,而之前所有的执行,包括return,全部都停留在栈中,而finally最终执行后才继续。所以这样也能解释,第一次代码本应该回溯的代码执行完finally后才回溯,return的时候也是等finally执行之后再执行。

    或许“return的时候也是等finally执行之后再执行”这句话又引出了一个问题:finally究竟是直接运行完结束,还是运行完之后再回到原来return的地方?

    这里我们可以把i++换成++i,结果就不截图了――finally就是最终执行,如果有return,直接从finally返回。

    还有一种情况,直接结束程序会怎么样?

    package me.iwts;

    public class Main{

    public static void solve(){

    try{

    System.out.println("try");

    System.exit(0);

    }finally {

    System.out.println("finally");

    }

    }

    public static void main(String args[]) {

    solve();

    }

    }

    结果:

    try

    强制结束大过天。由此,也可以认为特殊情况导致程序直接结束,不会执行finally。因为finally一般写的都是关闭对象、资源的代码,所以这些特殊情况导致的程序强制结束,可能会引发一些问题的。

    以上这篇Java.try catch finally 的执行顺序说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持云海天教程。

    原文链接:https://blog.csdn.net/qq_45239139/article/details/104849154

    展开全文
  • finally究竟什么时候执行

    千次阅读 2017-07-13 16:44:15
    最近这几天再看一些面试题,顺便回忆巩固一下基础知识,其中提到finally块中的code什么时候执行,在return前还是后。一般技术人员的认知是认为finally在return之前执行;在查找阅读了相关资料,并通过实际程序运行后...
  • 原创作者:Yes_JiangShuai 问题描述:try{}里有一个return语句,那么紧跟在这个try{}后面的finally{}中的代码是否会...如果会的话,什么时候执行,在return之前还是return之后? 在Java语言的异常处理中,finally...
  • 所以说这篇文章深入研究一下finally执行情况和返回值的情况。二、finally一定会执行吗?先给答案:肯定不是。我们可以看两种情况:1.在执行try块之前直接return,我们发现finally块是不会执行...
  • 但是一般什么时候执行呢???先看一段代码吧。 package T1; import java.util.*; public class A { private int i; public int f() { try { return ++i; }catch(Exception e) { return 1...
  • finally块中的代码什么时候执行

    千次阅读 2018-11-03 09:55:56
    任何语句要执行都只能在return前执行,因此finally块中的代码也是在return前执行的. 输出结果为: finally 1 finally块中的return语句会覆盖别处的return语句,最终返回到调用者的是finally的语句值 输出结果...
  • finally语句块什么时候执行? 1、没运行到try-catch语句这里就返回了。 1)在try语句之前,方法就有返回值,返回了,未执行到try语句。 int method{ return 1; //直接返回,运行不到try语句 try{ }finally{...
  • finally语句什么时候不会执行

    千次阅读 2019-10-24 17:00:47
    (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。 (2)在try块中有System.exit(0);这样的语句,...
  • 如果会的话,什么时候执行,在return之前还是return之后? 在Java语言的异常处理中,finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行。由于程序执行return就意味着结束...
  • 问题描述:try{}里有一个return语句,那么...如果会的话,什么时候执行,在return之前还是return之后? 在Java语言的异常处理中,finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行...
  • 1. 如果在try{} 语句块中有return语句,finally语句块中没有return语句,finally语句块中的代码在return语句前执行。 当 try{} 和 finally{} 中都存在return语句块,finally语句块中的return语句会覆盖其他return...
  • 3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行...
  •  执行完1之后,会执行return后面的表达式2(也就是返回值,此时返回值会赋给另一个局部变量(假设为backValue)存放在内存中),之后执行finally中的5,最后执行3(return backValue 而不是 ret
  • 在 Java 语言的异常处理中,finally 块的作用就是为了保证无论出现什么情况,finally 块里的代码一定会被执行。由于程序执行 return 就意味着结束对当前函数的调用并跳出这个函数体,因此任何语句要执行都只能在 ...
  • 执行cmd.ExecuteScalar(),把返回值暂时存起来,然后再去执行finally(钱放在这,我去劫个色),然后把返回值返回。return都是最后执行,但是return后的表达式的计算则是在finally之前。 如果C#设计的是先执行...
  • to do stuffto return in tryto return in finallytest2Return : finally这里在 try 中没有抛出异常,因此不会转到 except 中,但是在try 中遇到return时,也会立即强制转到finally执行,并在finally中返回test1和...
  • 近日执行一段陈旧的代码,一个Batch执行EXE,每日无限循环。唯一可以停掉该Batch的方法,就是直接将进程杀掉,或者在Batch的CMD窗口...但其Finally中原本希望的执行的,关掉Excel进程的部分,并没有正常执行。细读...
  • python中的finally用法

    2021-02-03 09:04:48
    来源:强哥 公众号:Python与数据分析 链接:https://mp.weixin.qq.com/s/6jBvyl1YoVBRyVQCdC67Sg无论try语句中是否抛出异常,finally中的语句一定会被执行。我们来看下面的例子:try:f = open("/tmp/output", "w")f...
  • 1. 当try{}有return语句,finally{}有return语句 直接上程序 public class TestFinally { public static int testFinally1() { try{ return 1; }catch(Exception e){ ret...
  • 下面根据示例说下finally正常执行时候的顺序。 import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Opt...
  • finally什么时候执行

    千次阅读 2013-01-15 10:19:53
    1、finally在try ...catch 执行完毕后一定会执行的 2、Exception可以多次捕抓,但是...finally什么时候执行 public class FinallyTest { public void test(){ boolean b = false; try{ System.out.println("in te
  • C# 中 finally 的用法

    2021-04-13 10:43:00
    因此不能保证一个语句结束后,它后面的语句一定会执行,在 C# 中这个问题可以用 finally 解决。 为了确保一个语句总是能执行(不管是否抛出异常),需要将该语句放到一个 finally 块中,finally 要么紧接在 try 块...
  • try,catch,finally执行顺序(超详细)

    千次阅读 2020-04-18 14:39:30
    当try中带有return时,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息。所以,这里方法返回的值是try中计算后的2,而非finally中计算后的3 ②...
  • 主要深度介绍了Java编程中finally语句的执行原理,细致讲解了finally在异常处理中的流程控制作用,需要的朋友可以参考下
  • 总结 从上述的字节码例子中可以得出结论,编译器在编译Java代码的时候,会把finally代码块里的内容,复制一份,分别放在try块和catch块里所有正常执行路径以及异常执行路径的出口中,从反编译的字节码里也很容易就...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 488,604
精华内容 195,441
关键字:

finally什么时候执行