陷阱17 脱离控制——if语句没加大括号“{”和“}”
在程序中经常需要使用if 等分支结构,实现对程序的流程进行控制,if 语句是程序当中最常用的一种分支结构,可以说要编程就离不开if语句,由此可见if语句的重要性,如果if 语句使用不正确,就会使程序发生逻辑错误,影响整个系统的执行,甚至会造成严重的经济损失。
对于一些刚刚走上编程岗位的程序员,很容易犯这样一个错误,那就是在使用if 语句时不加大括号“{”和“}”,对于一个优秀的程序,应做到简单清晰、易于理解,就这一点而言,不加大括号就已经不可取了,实际上还有更严重的,那就是会导致程序的执行逻辑不正确,从而对整个系统造成影响。
说明
使用if 语句不加大括号,在很大程度上是由于在刚刚学习编程时养成的坏习惯,因为那时经常使用if 语句控制一条语句的执行,if 语句控制一条语句的执行时,是完全可以将大括号“{”和“}”省略的。
没有添加大括号,导致程序发生错误的示例:
计算产品的总金额,只有当产品编号是1008时,才通过产品单价800与产品数量100计算出产品的总金额,并输出产品编号和产品的总金额,否则什么也不做。
public class BigBracket { private int productId = 0; // 定义成员变量产品ID private int price = 0; // 定义成员变量产品单价 private int number = 0; // 定义成员变量产品数量 private int totalMoney = 0; // 定义成员变量产品总金额 public void outputTotalMoney (int id){// 定义输出信息的方法,形参id是传入的产品编号 if (id == 1008) // 判断传递的参数是否为1008,如果是1008就向下执行 productId = id; // 为成员变量赋值为参数id的值 price = 800; // 为成员变量单价赋值为800 number = 100; // 为成员变量数量赋值为100 totalMoney = price * number; // 计算总金额 System. out. println ("产品ID是"+productId+"的产品"); System. out. println ("其总金额是:"+totalMoney); } public static void main (String[] args) { BigBracket bracket = new BigBracket (); // 创建类的实例 bracket. outputTotalMoney (1001); // 调用方法,并传递实参1001 } }
运行本示例,程序将在控制台输出如图3.13所示的产品信息,即产品ID是0的产品,而本示例的原意是产品ID是1008才输出,所以结果是错误的。
图3.13 在控制台输出的产品信息
说明
本示例之所以输出如图3.13所示的信息,是由于在使用if语句时,没有在if语句后添加大括号“{”和“}”将黑体字代码括起来,所以导致程序执行了不该执行的语句,因此输出了如图3.13所示的信息,如果用大括号“{”和“}”将黑体字代码括起来,则当调用方法outputTotalMoney ()时,如果为其传递的实参不是1008,程序就不会输出任何信息。
添加大括号,使程序正确执行,示例:
public class BigBracket {
private int productId = 0; // 定义成员变量产品ID
private int price = 0; // 定义成员变量产品单价
private int number = 0; // 定义成员变量产品数量
private int totalMoney = 0; // 定义成员变量产品总金额
public void outputTotalMoney (int id){ // 定义输出信息的方法,形参id是传入的产品编号
❷if (id == 1008) { // 判断传递的参数是否为1008,如果是1008就向下执行
productId = id; // 为成员变量赋值为参数id的值
price = 800; // 为成员变量单价赋值为800
number = 100; // 为成员变量数量赋值为100
totalMoney = price * number; // 计算总金额
System. out. println ("产品ID是"+productId+"的产品");
System. out. println ("其总金额是:"+totalMoney);
}
}
public static void main (String[] args) {
BigBracket bracket = new BigBracket (); // 创建类的实例
❶bracket. outputTotalMoney (1001); // 调用方法,并传递实参1001
}
}
说明
运行本示例时,由于在标记❶处调用方法outputTotalMoney ()时,为其传递的实参是1001,所以执行outputTotalMoney ()方法时,当程序执行到标记❷处时,判断产品编号不是1008,不执行其后大括号内的代码,因此不会输出任何信息;如果在标记❶处调用方法outputTotalMoney ()时,将为其传递的实参改为1008,程序将在控制台输出如图3.14所示的正确结果。
图3.14 在控制台输出正确的产品信息