Chinaunix首页 | 论坛 | 博客
  • 博客访问: 805305
  • 博文数量: 780
  • 博客积分: 7000
  • 博客等级: 少将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-12 09:11
文章分类

全部博文(780)

文章存档

2011年(1)

2008年(779)

我的朋友
最近访客

分类:

2008-09-12 09:23:44

  第3条 忘记对资源进行分配和释放

  说明:所谓资源是指CPU,内存,文件等系统资源。系统资源是有限的,并且会被多个过程所调用。因此,在调用资源之前,第一件事情是必须分配资源。而对已经分配的资源,如果使用之后不加以释放,势必造成资源泄漏,直接导致深度Bug,性能问题,所以必须加以充分的注意。

  经常发生的一件事是,在进行文件操作时,打开的文件必须及时关闭。无论是二进制流还是字符流,一旦在生成流时被打开,直到Close方法被调用之前,流所使用的资源都处于被占用的状态。所以,当资源已经不需要时,一定不要忘记调用Close方法。对于打开的文件,在finally中调用close方法,可以确保在发生异常时被关闭。

  另外,不仅仅是针对文件,应该保持这样的警惕,即对有效资源(可能被共用)不可以长期占用。比如说下页中举的例子,数据库资源(java.sql.Connection,java.sql.Statement等)是典型的必须避免占用的资源。因此而引起的问题是经常发生的。

  例子 ① 可能发生DB资源泄露的典型代码


  Connection con = null;
  PreparedStatement ps = null;
  Try{
  Class.forName(“指定DB驱动”); //Load DB DriverManager
  con = Drivermanager.getConnection(“DB URL”);
  ps = con.prepareStatement(运行用SQL“);
  // 某种处理
  ps.close(); //ERROR: 处理到这里之前如果发生异常,将无法关闭
  con.close(); // ERROR: 处理到这里之前如果发生异常,将无法关闭
  }catch(ClassNotFoundException e1){
  e1.printStackTrace();
  }catch(SQLException e2){
  e2.printStackTrace();
  }

  例子 ② 用finally确实关闭DB资源

  同①背景相同的代码

  //某种处理

catch(ClassNotFoundException e1){ 
  e1.printStackTrace();
  }catch(SQLException e2){
  e2.printStackTrace();
  }finally{
  if( ps != null ){
  try{
  ps.close(); //OK:即使在处理中发生异常也可以保证关闭。
  }catch(SQLException e3){
  e3.printStackTrace();
  }
  if( con != null){
  try{
  con.close(); //OK:即使在处理中发生异常也可以保证关闭。
  }catch(SQLException e4){
  e4.printStackTrace();
  }
  }
  }

  补充说明:通过垃圾回收机制释放对象

  语言中有垃圾回收机制,在的Heap上分配的对象,一般来说是不需要显式

  地释放的。但是,被释放的资源仅是垃圾回收处理中被判断为“程序已经不使用”的部分。

  详细内容可以参考该文章的补充5.

  第4条 在分支处理时遗漏条件

  说明:在if或者switch等控制命令中,把应该考虑到的条件遗漏掉,是比较典型的Bug.特别是,某些类型的条件遗漏,在以正常系为核心的测试中往往很难发现,却非常可能在产品交付后发现是致命的Bug,所以需要特别加以留意。

  为了不遗漏条件,必须注意以下2点:

  1. 编写正确的条件式

  为了“写出正确的条件式”,需要通过条件式的变换来验证写出的条件式是否表达了我们本来的意图(参考补充说明)。

  在此基础上,如果构成条件的表达式非常复杂,就需要使用真值表对条件式构成及关系进行整理(参考补充说明表)。

[1]    

【责编:John】

--------------------next---------------------

阅读(341) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~