Java中return返回结果的优先级

在Java开发时,异常处理是非常普遍的。先看这样一道关于异常处理的代码

public static int getNumer() {
    int a = 1;
    try {
        return a;
    } catch (Exception e) {
        a = -1;
    } finally {
        a = 30;
        System.out.println(a);
    }
    return a;
}

当执行System.out.println(getNumer())返回的结果应该是多少?
A 30 30
B 30 1
C 1 30
答案是B。这个问题的本质就是在try,catch,finally中都有return语句时,执行代码的顺序是怎么样的,是根据哪个值来进行返回呢?

我们知道,在处理异常时,finally中的代码是必定要执行的,这是由Java编译器决定的,在编译的时候,将try模块的代码与finally模块的代码合并在一起,将catch模块的代码与finally模块的代码合并在一起,这是毫无疑问的。
这样,当finally模块有return,那么将会执行finally中的return,返回函数的结果,无论try, catch,还是函数体有没有return语句。所以,该位置的return的优先级是最高的。

那么,当finally没有return时,是如何返回的呢?
这时,在执行完try中的模块后,有return语句,实际不会真正的return,即只是会计算return中的表达式,之后将计算的结果保存在一个临时栈中,接着执行finally中的语句,最后才会从临时栈中取出之前的结果返回。
所以,函数的返回值是1而非30。

总体来说,return语句的位置有如下几种。

public static int getNumer() {
    try {
        return a;
    } catch (Exception e) {
        return b;
    } finally {
       return c;
    }
    return d;
}

当无异常抛出时,返回的优先级如下:c>a>d。当然,如果c存在,d是不可达代码,编译会错误的,如下:

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
    Unreachable code

当有异常抛出时,返回的优先级如下:c>b>d。

总之,大家记住,finally块中的return优先级最高,而函数体中的return的优先级最低就好了。

原文地址:https://www.cnblogs.com/rinack/p/10325180.html

时间: 2024-10-12 22:50:42

Java中return返回结果的优先级的相关文章

java中return与finally的执行顺序

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到. (2)在try块中有System.exit(0);这样的语句,System.exit(0);

经典的java中return和finally问题!

经典的java中return和finally问题! 标签: 杂谈 分类: java学习 前一段时间 参加公司的笔试问了这个问题,回来一查才知道当时自己做错了,百思不得其解,上网查到下面的程序,但是运行后发现了错误,我修改后放在了我的blog 上面,希望和大家分享. 代码如下: public class Test { public static void main(String[] args) { System.out.print(tt()); } public static int tt() {

java中return的作用

return的常用作用有以下两种一种是返回参数所用的关键字,假如一个有返回值的方法执行完了之后需要返回一个参数,示例:public string functionTest(){ String a = "abc"; return a;}那么这个方法被调用之后就会返回一个值为abc的字符串,string result = functionTest(); 第二种用法是,代码执行到此处终止.比如当代码执行到某个地方会出现几种结果,然后其中一种结果就不能执行后续代码,这时候在那里加上一个retu

java中return语句的用法总结

return算是各大语言的常客,基本上都有return语句,那么在JAVA中,return有什么特殊的地方吗,下面我们来分析下 1.return语句的作用:a.返回一个值,这个值可以是任意类型.b.使程序返回到操作系统(即终止程序) 2.java中对于一个函数,不论有没有返回值类型,都可以带有return 语句. 但是区别在于,return 语句是否可以返回一个值(这取决与该函数的返回值类型). a.如果函数有返回值类型(即返回值类型不为void ),则必须带有返回相应类型值的return 语句

Java 中无返回值的方法在使用时应该注意的问题

Java 中的方法是形态多样的.无返回值的方法在使用时应该规避哪些问题呢? 一.不可以打印调用或是赋值调用,只能是单独调用(非常重要): 二.返回值没有,不代表参数就没有: 三.不能return一个具体的值,否则会报错: 四.return分号可以直接省略: 五.无返回值方法应该使用类型void. 原文地址:https://www.cnblogs.com/yanglongbo/p/10981842.html

try--catch--finally中return返回值执行的顺序(区别)

1.try块中没有抛出异常,try.catch和finally块中都有return语句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public static int NoException(){          int i=10;          try{            System.out.println("i in try block is:"+i);            return --i;          }        

JAVA中return的用法

1 public class TestReturn 2 { 3 4 public static void main(String args[]) 5 { 6 TestReturn t = new TestReturn(); 7 t.test1(); 8 System.out.println(t.test2()); 9 int sum=getSum(4,6); 10 System.out.println("sum="+sum); 11 get(4,5); 12 } 13 14 15 pu

java中return在Try-Catch中的执行顺序

我们知道return会结束此方法并返回指定值.以及在Try-catch-finally中无论try代码块中有没有异常finally中的代码时都会被执行的.但是如果return包含在try-catch-finally中的try或catch块中会怎样呢? 我们再做个试验: 1 static int txt(){ 2 try { 3 @SuppressWarnings("unused") 4 int a=5/0; 5 7 } catch (Exception e) { 8 System.ou

PHP中return返回数组的一点用法

本文就学习中遇到的PHP函数return返回值的问题,这一点return用法进行了说明. 在函数的内部用return返回一个值或者为空来结束函数的运行.但是在return一个数组的时候,也可以在函数的内部直接使用print_r来打印.但一般都不这么做. 拿上一篇文章举例: 也可以这么实现: <span style="font-family:Microsoft YaHei;font-size:14px;"><?PHP function bubble($array){ $