Java笔试面试总结——try、catch、finally语句中return的各种情况问题,今天抽空整理了一下这个知识点,然后记录下来。正文本文主要通过实例说明各种情况。这里我按照try-catch-finally语法块分为两种主要情况来讨论:try-catch语法块和try-catch-finally语句块,然后我们分情况详细讨论。1、try-catch语句块我们可以看下面的程序:publicstaticvoidmain(String[]args){System.out.println(handleException0());}/***try,catch都有return*@return*/privatestaticStringhandleException0(){try{System.out.println("startoftry");字符串s=null;int长度=s.charAt(0);System.out.println("尝试结束");return"try块的返回值";}catch(Exceptione){System.out.println("异常被捕获");return"捕获的返回值";}}执行结果:try开始捕获异常catch的返回值分析:程序首先执行try块中的代码,如果在try块中发现异常,try块后面的代码将不会执行(也不会自然返回),然后进入匹配到异常的catch块,再进入catch块执行代码后,当执行到catch中的return语句时,程序终止,然后是最终结果的回报被退回。2.try-catch-finally语句块这个语法块分为4种情况进行讨论,下面我会一一列举。1、第一种情况,try块中有return,捕获异常例1:publicstaticvoidmain(String[]args){Stringresult=handleException1();System.out.println(result);}privatestaticStringhandleException1(){try{System.out.println("trystart");字符串str=null;intlength=str.length();System.out.println("尝试结束");}catch(Exceptione){System.out.println("异常被捕获");}finally{System.out.println("finally块执行完毕");}return"Thefinalresult";}例1的执行结果如下:try开始捕获异常,执行finally块。最终结果示例2:publicstaticvoidmain(String[]args){Stringresult=handleException2();System.out.println(result);}privatestaticStringhandleException2(){try{System.out.println("开始尝试");字符串str=null;intlength=str.length();System.out.println("尝试结束");return"try块的返回值";}catch(Exceptione){System.out.println("异常被捕获");}finally{System.out.println("finally块执行完毕");}return"Thefinalresult";}Example2执行结果如下:try开始捕获异常,执行finally块。最终结果分析:首先,例1和例2的结果很显然,遇到异常时,直接进入匹配的catch块,然后继续执行finally语句块,最后返回返回结果。第二种情况:try块中有return,但是不会被catch转到异常示例3:思考:下面代码的try语句块中有return语句,那么是否可以直接return和执行try语句块后退出方法?publicstaticvoidmain(String[]args){Stringresult=handleException3();System.out.println(result);}privatestaticStringhandleException3(){try{System.out.println("");return"try块的返回值";}catch(Exceptione){System.out.println("异常被捕获");}finally{System.out.println("finally块已经执行");}return"Thefinalresult";}例3的执行结果如下:finally块被执行。try块的返回值分析:例3的结果。其实我们可以通过断点来查看程序的具体执行过程。通过断点,我们可以发现代码先执行了try块中的代码。当return语句执行时,handleException3方法并没有立即结束,而是继续执行finally块中的代码。finally块中的代码执行完后,返回try块的return语句,然后返回最终结果,执行handleException方法。第三种情况:try块中有return,finally例4:publicstaticvoidmain(String[]args){System.out.println(handleException4());}/***Case3:tryandTherereturninfinally*@return*/privatestaticStringhandleException4(){try{System.out.println("");return"try块的返回值";}catch(Exceptione){System.out.println("异常被捕获");}finally{System.out.println("finally块执行完毕");return"finally的返回值";}//return"Thefinalresult";//不能再有returnsValue}例4执行结果:finally块执行完毕。finally返回值分析:需要注意的是,当try块和finally中有return时,不允许在try/catch/finally语法块之外。返回关键字。下面通过程序中的断点来看一下代码的具体执行流程。该代码首先执行try块中的代码。当return语句执行时,handleException4方法并没有立即结束,而是继续执行finally块中的代码。当finally块中发现return时,finally块中的return直接返回值(也就是最后的结果),handleException4方法执行完毕。第四种情况:try块、catch块、finally块都有return例5:publicstaticvoidmain(String[]args){System.out.println(handleException5());}/***情况4:try,catch,finally都有return*@return*/privatestaticStringhandleException5(){try{System.out.println("trystart");int[]数组={1,2,3};inti=数组[10];System.out.println("尝试结束");return"try块的返回值";}catch(Exceptione){e.printStackTrace();//这行代码其实就是打印输出异常信息的具体输出System.out.println("caughtexception");return"捕捉返回值";}finally{System.out.println("finally块执行完成");return"最终返回值";}//返回“最终结果”;}示例5的执行结果:try捕获异常finally块执行完成finally返回值java.lang.ArrayIndexOutOfBoundsException:10atcom.example.javabasic.javabasic.ExceptionAndError.TryCatchFinally.handleException5(TryCatchFinally.java:25)atcom.example。javabasic.javabasic.ExceptionAndError.TryCatchFinally.main(TryCatchFinally.java:14)分析:程序首先执行try块中的代码,发现try块中出现异常,try块后面的代码将不会执行(自然不会返回),然后进入匹配异常的catch块,再进入catch块执行代码。当执行到catch中的return语句时,程序不会立即终止,而是继续执行finally块中的代码finally执行return,然后返回本次return的最终结果。其实通过上面的例子我们可以发现,不管return关键字在哪里,finally都一定会被执行。理论上,在try、catch、finally块中允许使用return关键字,但是执行优先级低的块中return关键字定义的返回值会覆盖执行优先级高的块中return关键字定义的return执行优先级值。也就是说finally块中定义的返回值会覆盖catch块和try块中定义的返回值;catch块中定义的返回值将覆盖try块中定义的返回值。也就是说,如果返回值是在finally块中通过return关键字定义的,那么之前所有通过return关键字定义的返回值都将无效——因为finally块中的代码必须被执行。最后,最近有很多朋友找我要一份Linux学习路线图,所以我结合自己的经验,利用业余时间熬夜一个月,整理了一本电子书。无论你是面试还是自我提升,相信都会对你有所帮助!免费送给大家,只求大家给我点个赞!电子书|LinuxDevelopmentLearningRoadmap也希望有小伙伴可以和我一起把这本电子书做得更完美!获得?希望老铁们来个三连击,让更多人看到这篇文章。推荐阅读:干货|程序员和高级架构师免费发送工件的必备资源|支持搜索的资源网站
