明月镇魂 2022-08-20 02:05 采纳率: 100%
浏览 55
已结题

关于#java#的问题:在java中,return后面跟着语句,编译时一定报错么?


public class Demo02 {

    public static void main(String[] args) {

        test();
    }

    public static void test() {
        int a = 3;
        if (true) {
            return;
        }
        //else return;

        System.out.println(1);
    }
}

如上代码,if的条件是true,这就代表这调用test方法时,return一定会执行,后面的打印语句看起来是无法执行到的,按照平常来讲,这种代码直接就会编译报错,但是实际上是没有报错,除非加上else return;才会出现报错,请问这是为什么呢?JVM在进行编译的时候是怎么编译这段代码的呢?java在编译if else的时候会检查if()中的条件么?

看起来编译器在编译时,只会进行语义检查,并不会对if的条件进行实际计算。
有返回值的方法的检查每一个分支是否有值返回,以及后续语句能否执行到。
没有返回值的方法更关注后续语句是否能够正常执行

  • 写回答

5条回答 默认 最新

  • 斗迷飞鸟 2022-08-20 04:00
    关注

    (1)问题分析
    从结果上来看,java的编译器并不会查看if语句的条件是否一定成立,其似乎只关心从结构上讲一定会有return后不应该再有待编译语句。如果只有if语句里面有return,那编译器可能认为还存在if条件不成立的情况,但如果else语句里面也有return,那编译器就知道if和else结构后一定已经return了,此时如果后面还有待编译语句的话,就会触发“error: unreachable statement”的编译错误。
    (2)代码验证分析1
    同样加入else语句,但是else结构里面不返回,程序是可以正常编译运行的

    class Demo02 {
     
        public static void main(String[] args) {
     
            System.out.println("Program starts.");
            test();
        }
     
        public static void test() {
            int a = 3;
            if (true) {
                return;
            }
            else
            {
            }
     
            System.out.println("Test ends.");
        }
    }
    

    程序运行结果:

    img


    (3)代码验证分析2
    将else语句换成else if(true)语句,程序同样可以正常编译运行

    class Demo02 {
     
        public static void main(String[] args) {
     
            System.out.println("Program starts.");
            test();
        }
     
        public static void test() {
            int a = 3;
            if (true) {
                return;
            }
            else if(true)
            {
                return;
            }
     
            System.out.println("Test ends.");
        }
    }
    

    程序运行结果:

    img


    (4)总结
    测试结果表明,对java编译器来说,只要从结构上讲,不是所有分支都一定return,那么后面就可以继续加待编译语句。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 8月28日
  • 已采纳回答 8月20日
  • 修改了问题 8月20日
  • 修改了问题 8月20日
  • 展开全部

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料