(2) else的注重问题. 一般总认为假如if语句只有一句的话,那么{}就是可要可不要的了。可是假如if有else嵌套的话,就不一样了,{}是必需的 错误示例: if (i < 5) if (i < 2) i++; else i--; 修改后: if (i < 5) { if (i < 2) i++; } else { i--; }
(6)不要直接或者间接的定义'Error'和'Throwable'的子类 'java.lang.Error'只在JVM出现反常的时候覆盖这个方法,假如你定义了直接或者不直接的类继续了类'Error',也就指出了这个错误是JVM内部的,而不是这个类的。所以对于java编译器来说是不可见的,这样就不能检查错误的异常处理了。 'java.lang.Throwable'是'java.lang.Exception'和'java.lang.Error'的上级类,用户假如象定义异常类的话应该继续'java.lang.Exception'。 错误示例:public class ABC extends Error 正确:public class ABC extends Exception
(7)有关"switch"语句里面的"case"问题 最好在每一个 “case”里都定义一个”return”或者“break”来控制不要走到下面的 “case”里去。假如一个”case”语句在代码的最后没有一个”break”或者”return”句,程序就会走到下一个”case”。假如这个”case”是最后一个的话,那就没什么问题,假如后面还有”case” 的话,看起来就不太安全了。 错误示例: switch (i) { case 1: x = 10; break; case 2: x = 20; default: a = 40; break; 正确: switch (i) { case 1: x = 10; break; case 2: // VIOLATION x = 20; break; default: x = 40; break;
(8)建议不要使用'System.getenv ()' 不建议使用'System.getenv ()',这个方法看起来很好用,不过并不是所有的系统都有环境变量的。不用这个方法也可能带来一些不方便。 错误示例: void method (String name) { System.getenv (name); // 可以用其他方法来代替 } 假如不用这个方法,我们可以用其它的方法来代替。比如:'System.getProperty ()’,'getTypeName ()'等,这也可以找到java的系统属性。 参考:David Flanagan: "Java in a Nutshell". O'Reilly November, 1999: Third Edition, pp.190-192
(9)不要使用’/n’或者'/r'来分行 这两个标记看来很普遍,非凡是’/n’。我们经常用来作为分行用。但是不同的系统用不同的分行字符,所以这些字符在某些意义上违反了java的平台无关性。 错误示例: System.out.println("Hello/n" + name); 我们可以用其它的一些方法来代替,比如println(),这个方法在不同的系统平台上都起到相同的作用。后者推荐大家用这个方法:System.getProperty("line.separator") 参考:David Flanagan: "Java in a Nutshell". O'Reilly, November 1999: Third Edition, pp. 191-192
(10) 使所有的内部类"private". Java答应一个类包含另外一个类,带是Java byte code没有这个概念。类被编译器解释成package-private类。从更深的程度来说,包含类的任何内部私有对象能被内部类访问的也能被同一个包内的其他类访问。 错误示例: public class INNER { class INNER_Class { void setValue(int i) { _value = i; // 现在包就可以访问了 } } private int _value; } 所以需要加上private class INNER_Class 参考:Statically Scanning Java Code: Finding Security Vulnerabilities. John Viega, Gary McGraw, Tom Mutdosch, and Edward W. Felten IEEE SOFTWARE September/October 2000
(11)不要使接口序列化 假如一个字节数组包含了一个被序列化的对象。攻击者就能读到这个对象的内部状态合字段(包括private的)。 错误示例: public interface sample extends java.io.Serializable