精灵王
- 注册日期2010-12-08
- 发帖数640
- QQ
- 火币1103枚
- 粉丝120
- 关注75
|
阅读:3431回复:0
JAVA规则??中级篇-JSP教程,Java技巧及代码
楼主#
更多
发布于:2011-01-26 21:37
| | | | 本文介绍的java规则的说明分为3个主要级别,中级是平时研发用的比较多的级别,在今后将陆续写出其他的规则。遵守了这些规则能提高程式的效率、使代码又更好的可读性等。 (1) 在finally方法里关掉input或output 资源 再方法体里面定义了input或output流的话,需要在finally里面把他关掉。 以下这几种调用不必遵守这条规则,因为colse()方法不起作用:) java.io.stringwriter java.io.bytearrayoutputstream java.io.bytearrayinputstream 如果再方法返回的时候没有调用close()方法来释放input()和output()的资源的话,会导致一个系统资源泄漏。而且在所有情况下都要确定在返回全调用了close() 方法,包括出现异常的时候。所以需要在finally方法里面加入这个方法。这样就确保了在所有情况下都会关闭资源。 错误示例: public class cio { public void method (java.io.file f) { java.io.fileinputstream fis = null; try { fis = new java.io.fileinputstream (f); fis.read (); fis.close (); } catch (java.io.filenotfoundexception e1) { system.out.println("file not found"); } catch (java.io.ioexception e2) { system.out.println("i/o exception"); } // 如果出现异常,这里就不能确保关闭资源。 } } 修正后的代码: public class ciofixed { public void method (java.io.file f) { java.io.fileinputstream fis = null; try { fis = new java.io.fileinputstream (f); fis.read (); } catch (java.io.filenotfoundexception e1) { system.out.println("file not found"); } catch (java.io.ioexception e2) { system.out.println("i/o exception"); } finally { if (fis != null) { try { fis.close (); } catch (java.io.ioexception e) { system.out.println("i/o exception"); } } } } } (2) else的注意问题. 一般总认为如果if语句只有一句的话,那么{}就是可要可不要的了。可是如果if有else嵌套的话,就不相同了,{}是必需的 错误示例: if (i < 5) if (i < 2) i++; else i--; 修改后: if (i < 5) { if (i < 2) i++; } else { i--; }(3) 不要再catch()块里什么代码也不放 在catch()块里面放入一些错误处理代码是个好的习惯。不过如果catch()里面有有关javadoc 的代码,那也是能的。 错误示例: try { system.in.read (); } catch (java.io.ioexception e) { // 错误 }正确: try { system.in.read (); } catch (java.io.ioexception e) { system.out.println("descriptive error"); } 参考:joshua bloch: "effective java - programming language guide". addison-wesley, 2001, pp. 187(4) 不要在if条件里面附值 如果这样做的话,系统会报告错误。在java的非常多条件声明里面用附值是非常不明智的,而且系统也会报告错误。非常容易引起异常。遵守这条规者能够使维护简单,避免不一致。 错误示例: if (b = true) 正确的: if (b == true) 参考:section 10.4 of http://java.sun.com/docs/codeconv/html/codeconventions.doc9.html#547(5) for语句需要循环体。 如果没有{}的话,for语句只会执行一次! 错误示例: for (i = 0; i < 10; i++) ; system.out.println (i); 这里print() 只会执行一次。 正确: for (i = 0; i < 10; i++) { // fixed system.out.println (i); }(5) 不要把方法定义成main(). 在java里,main()方法是个特别的方法。所以在自己定义方法的时候不要定义这样的名字,以免引起混扰。(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". oreilly 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". oreilly, 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
| | | | |
|