网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  java规则中级篇     
  文章作者:未知  文章来源:水木森林  
  查看:66次  录入:管理员--2007-11-17  
 
  本文介绍的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". 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
 
 
上一篇: java应用程序中的按值传递语义以及相关评论    下一篇: java程序编码规范与技巧
  相关文档
oracle adf框架介绍 11-17
java程序得到域名对应的所有ip地址 11-17
各种系统安装j2se5.0 jdk和netbeans4.1 11-17
一个显示日期的简单小程序,主要是学习静态变量的用法 11-17
用web service进行企业级的门户集成 11-17
jakarta struts学习之实战演示 11-17
深入理解abstract class和interface 11-17
struts1.2.2新功能全新体验 11-17
java性能优化技巧之gui篇 11-17
java数据对象技术jdo(1) 11-16
如何用开源软件构建 java 编程环境 11-17
swing读书笔记事件处理 11-17
再谈客户端的 java 技术 11-16
java多线程同步-busyflag或lock 11-17
java规则引擎工作原理及应用 11-17
在java应用程序中动态分配cpu资源 11-17
利用easymock测试jdbc的过程详细解析 11-16
构建wap应用程序开发环境 11-16
activemq和lingo实现jms和异步调用 11-17
使用orm工具进行数据访问 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息