Java中为何部分if/else语句无需使用大括号{}?
我最近在完成CodingBat平台Logic-1模块的alarmClock任务时,编写了如下代码:
public String alarmClock(int day, boolean vacation) { if (!vacation) { if (0 < day && day != 6) { return "7:00"; } else { return "10:00"; } } if (vacation) { if (0 < day && day != 6) { return "10:00"; } else{ return "off"; } } }
运行时一直提示编译错误:Compile Problems: missing return statement line:18。尝试调整无果后,我参考了朋友的正确代码:
public String alarmClock(int day, boolean vacation) { if (!vacation) { if(0 < day && day != 6) return "7:00"; else return "10:00"; } else if (day > 0 && day != 6) return "10:00"; else return "off"; }
我注意到朋友的代码中部分if/else语句没有使用大括号{},而我所学的是if语句需要用大括号包裹代码块,因此想请教:为什么这些if/else语句可以省略大括号?
为什么if/else可以省略大括号?
在Java(还有不少和C语法类似的语言)里,if或者else语句后面只要只有一条执行语句,就可以不用写大括号。这条语句可以是return、赋值,甚至是另一个嵌套的if/else。
比如你朋友代码里的这段:
if(0 < day && day != 6) return "7:00";
这里if后面就只有return "7:00";这一行代码,所以大括号可以省掉。else后面的return "10:00";也是同样的道理,单条语句就能省略大括号。
不过要提醒一句:虽然语法允许这么做,但如果之后要给这个if/else加新代码,忘记补大括号的话,很容易出逻辑bug——新代码会不受if/else的条件控制,直接执行。所以很多团队会要求哪怕单条语句也要加大括号,方便后续维护。
顺便说下你原来代码的编译错误
你碰到的missing return statement错误,是因为编译器不认你那两个独立的if逻辑。虽然我们知道vacation要么是true要么是false,但编译器不会做这么智能的逻辑推导——它看到你写了两个分开的if (!vacation)和if (vacation),就会觉得可能存在一种情况,两个if都不满足(虽然实际不可能),所以要求你必须在函数最后加个return,或者把第二个if改成else,让编译器确定所有路径都有返回值。
内容的提问来源于stack exchange,提问作者intEOF

