(2) else的注重問題. 一般總認為假如if語句只有一句的話,那么{}就是可要可不要的了??墒羌偃鏸f有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;
?。?)建議不要使用'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
?。?)不要使用’/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
?。?1)不要使接口序列化 假如一個字節數組包含了一個被序列化的對象。攻擊者就能讀到這個對象的內部狀態合字段(包括private的)。 錯誤示例: public interface sample extends java.io.Serializable