命名风格 取消不良命名习惯 良好的命名风格在遵守Java命名语法之上对命名提出了更高的要求良好的命名风格必须遵守以下的命名规则 ) 类或接口必须以大写字母打头 ) 方法属性成员变量局部变量以小写字母打头且不以_或$打头 ) 常量的所有字母都大写 ) 异常类以Exception结尾 良好命名对应Naming Style下的Naming Conventions设置项 建立和国际接轨的包名 包名应该用顶级域名打头如comorgedu等或者用国家代码如cnru等 一般公司和组织都对包名前两级都有严格的规则如IBM公司的类以comibm打头apache以orgapache打头第三级才是具体的项目或产品名称这样的包命名就象三维网的URL命名一样已经成为了一种国际通用的准则对此没有作出严格规定的公司开发负责人应该推动建立起符合这一命名规则的规范 该审查项默认情况下没有激活可以通过Naming Style下的Package Name的设置项激活 避免用过于简单的变量名 除了循环体中的临时变量及一些没有特殊意义的常见数据类型应该尽量避免使用一个字符作为变量那些无特殊意义且常见的数据类型所选取的单字符变量名必须按表进行命名 表 变量本身无意义的常见数据类型允许的单字符变量 此外为了减少潜在的沖突避免不必要的混淆不允许以大写域名或国家代码作变量名 代码清单 取有意义的变量名 void method(double d) { int i; Exception e; char s;//应该改为c Object f;//应该改为o String k;//应该改为s Object UK;//和英国国家代码相同应改为其他的名字如ukObj Object COM;//和域名相同应改为其他的名字如obj_ } 该审查项在默认情况下没有激活可以通过Naming Style下的Use Conventional Variable Names的设置项激活 潜在错误审查 聚焦switch 由于switch流程控制语句语法的特殊性编写程序时需要特别注意否则将会埋下祸根JBuilder从以下个方面对switch进行审查 ) 有无对前面没有break语句的case从句作标识根据Sun编码惯例程序入口点从一个case进入直接到达下一个case代码段即前一个case没有对应的break语句时在跨过的地方必须给出一个显示的注释表示是特定流程控制的要求而非无意遗漏来看下面的代码 代码清单 没有break的case从句 switch (c) { case +: break; case : case n: case : case \t: break; } 假设在代码清单的第行之前是因为疏忽而遗漏了一个break语句第行之前是逻辑需要而故意不加break语句则将代码更改为 代码清单 更正的switch代码 switch (c) { case +: break; case : break; case n: //继续运行到下面 case : case \t: break; } 该审查内容对应于Possible Errors下的Break Statement is Missing before Case clause设置项 ) 在switch中出现非case的标签在Java语句中有两个标签即case分支标签另一个则是语句标签如果case分支标签语句误删或遗漏了case关键字则case分支标签将变成语句标签而编译器无法识别这个错误 代码清单 case分支中缺少case而使标签发生质变 public class CaseLabel { /**点*/ public static final int POINT = ; /**线*/ public static final int LINE = ; /**多边形*/ public static final int POLYGON = ;
public String getFigureType (int kind) { String tempName = null; switch (kind) { case POINT: LINE://该语句缺少case编译器将其作为语句标签处理并不会发生语法错误 //但该方法传入常量LINE时将转到default分支中而非到达这晨故 //应该将该行语句更改为case LINE: tempName = POINT and LINE; break; case POLYGON: tempName = POLYGON; break; default: tempName = UNDEFINE; } return tempName; } } 该审查内容对应于Possible Errors下的NonCase Label in Switch statement设置项 ) 有错误嫌疑的break和continuebreak和continue用于switch和循环中的跳转控制break用于提前结束循环以及从switch中退出break的这种多态性使得在循环体中内嵌switch语句时常会带来一些隐患即开发者本希望退出外层循环结果却只退出内层的switch语句而已JBuilder 对这项内容的审查包括以下方面 switch内嵌于循环体中且case从句中包含了不位于分支块最后位置的break语句 switch内嵌于循环体中且case从句既使用了break又使用了continue但两者的效果却是一样的 break或continue语句中使用了不必要的语句标签 请看下面的代码 代码清单 有错误嫌疑的break和continue void scan(char[] arr) { loop: for (int i = ; i < arrlength; i++) { switch (arr[i]) { case :case :case :case :case : //~的数字 case :case :case :case :case : { if (processDigit(arr[i])) { continue loop; //loop语句标签没有必要 } else { break; // 该break不会结束for循环应该使用break loop才可结束循环 } } case :case \t: { processWhitespace(arr[i]); continue; // 应该使用break而非continue } default: processLetter(arr[i]); break; } } 该审查内容对应于Possible Errors下的Suspicious Break/Continue设置项 避免对浮点值进行等值逻辑判断 浮点数都是一定精度的数据由于内部表示的误差往往字面上相同的两个浮点数其内部表示也不完全相同故此应避免对浮点值数进行等值逻辑判断而应采用逻辑比较判断 代码清单 语句中包含浮点等值判断 void calc(double limit) { if (limit == )//应改为通过和较小值比较来判断如if(Mathabs(limit) < ) { Systemoutprintln( the floatpoint number is exactly ); } } 该审查内容默认未激活可以通过Possible Errors下的Suspicious Break/Continue设置项来激活审查 添加()清晰化复杂的表达式 写复杂的表达式时不应过度依赖运算操作符的计算优先顺序而应养成使用()的好习惯当一个逻辑表达式由多个逻辑运算组成时应该用()划分不同的部分 代码清单 用括号清晰化表达式 boolean a b c; if (a || b && c) //应该替换成if ((a || b) && c) { } 该审查内容默认未激活可以通过Possible Errors下的Mixing Logical Operators Without Parentheses设置项来激活审查 字符串比较 Java初学者一个常犯的错误是使用==或!=对字符串进行等值逻辑判断使用==将判断两者否是指向相同的对象引用而非判断两者是否具有值应该使用equals()替代 代码清单 用equals()替换== public boolean equals(String s String s) { return s == s; //应改为return sequals(s); } 该审查内容对应于Possible Errors下的Use equals Instead of = =设置项 规避各种画蛇添足 将布尔变量和布尔值比较 没有必要将布 |