加入收藏 收藏网站 设为首页 设为首页
招生考试网
学历类| 阳光高考 研 究 生 自学考试 成人高考 专 升 本 中考会考 外语类| 四 六 级 职称英语 商务英语 公共英语 日语能力
资格类| 公 务 员 报 关 员 银行从业 司法考试 导 游 证 教师资格 财会类| 会 计 证 经 济 师 会计职称 注册会计 税 务 师
工程类| 一级建造 二级建造 造 价 师 造 价 员 咨 询 师 监 理 师 医学类| 卫生资格 执业医师 执业药师 执业护士 国际护士
计算机| 等级考试 软件水平 应用能力 其它类| 书画等级 美国高考 驾 驶 员 书法等级 少儿英语 报 检 员 单 证 员 出国留学
 招生考试网 - 计算机等级考试 - 考试辅导 - 正文

 
诊断Java代码:SplitCleaner错误模式
来源:fjzsksw.com 2009-11-20 编辑:yangmeiling 【字体:小 大】

Java编程语言的一个特色是存储自动管理,它把程序员从很容易出错的释放使用后的内存的工作中解放出来。尽管如此,许多程序还是得处理资源问题,例如文件和数据库连接,这些都必须在使用之后明确地释放掉。跟手工管理存储一样,程序员在手工管理资源时也会犯很多错误。其中一个就是本周专栏的主题 ― Split Cleaner错误模式。在 讨论论坛与作者及其他读者交流本文的心得。

  分开还是不分开

  在管理诸如文件和数据库连接这样的资源时,您必须在使用完资源后把它释放掉。当然,对代码的任何指定的执行,您希望一次获得资源,然后一次将其释放。要做到这点,您可以采用两种方式:

  •您可以在同一个方法中获得并释放资源。用这种方式,可以保证资源每获得一次,也释放一次。

•您可以跟踪代码的每一个可能的执行路径,并确保在每一个实例中资源最后都被释放掉了。

  第二种方式可能会出问题。因为您的代码库不可避免地要变大,另一个不熟悉您代码的程序员或许会添加一条没把资源释放掉的执行路径,其后果当然是资源泄漏。

  Split Cleaner 错误模式

  我把符合这种模式的错误称为 split cleaner,是因为释放资源的代码是沿各种可能的执行路径分开的。因为沿各条路径的释放代码很可能都是一样的,所以大多数 split cleaner 也是 rogue tile的例子。

  例如,假设您正用 JDBC 处理一张员工姓名表。您希望执行的许多操作中包括遍历这张表并对其中包含的数据进行计算。您要完成的最后一个操作可能是打印出所有员工的名字,如下所示:

  清单 1. 遍历一个员工表的代码

import java.sql.*;
public class Example {
    public static void main(String[] args) {
 String url = "your database url";
 try {
     Connection con = DriverManager.getConnection(url);
     new TablePrinter(con, "Names").walk();
 }
 catch (SQLException e) {
     throw new RuntimeException(e.toString());
 }
    }
}
abstract class TableWalker {
    
    Connection con;
    String tableName;
    public TableWalker(Connection _con, String _tableName) {
 this.con = _con;
 this.tableName = _tableName;
    }
    public void walk() throws SQLException {
 String queryString =("SELECT * FROM " + tableName);
 Statement stmt = con.createStatement();
 ResultSet rs = stmt.executeQuery(queryString);
 
 while (rs.next()) {
     execute(rs);     
 }
 con.close();
    }
    public abstract void execute(ResultSet rs) throws SQLException;
}
class TablePrinter extends TableWalker {
    
    public TablePrinter(Connection _con, String _tableName) {
 super(_con, _tableName);
    }
    public void execute(ResultSet rs) throws SQLException {
 String s = rs.getString("FIRST_NAME");
 System.out.println(s);
    }
    
}

 



 
网站版权与免责声明
①由于各方面情况的不断调整与变化,本网所提供的相关信息请以权威部门公布的正式信息为准.
②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权等问题,请在两周内来电联系.
最新文章
热门文章

报名考试
全国 | 黑龙江 | 吉林 | 辽宁 | 内蒙古
青海 | 宁夏 | 甘肃 | 新疆 | 陕西
西藏 | 北京 | 天津 | 河北 | 山东
江苏 | 安徽 | 河南 | 上海 | 浙江
福建 | 广东 | 山西 | 湖南 | 湖北
江西 | 广西 | 海南 | 云南 | 贵州
四川 | 重庆
分省高校计算机考试
黑龙江 | 吉林 | 辽宁 | 内蒙古 | 河北
北京 | 天津 | 新疆 | 甘肃 | 宁夏
青海 | 陕西 | 山西 | 河南 | 山东
江苏 | 安徽 | 浙江 | 福建 | 广东
海南 | 广西 | 江西 | 湖北 | 湖南
四川 | 上海 | 重庆 | 贵州 | 云南
西藏
成绩查询
报考指南
试题答案
模拟试题
考试辅导
计算机一级 | 计算机二级 | 计算机三级 | 计算机四级
经验交流
高校计算机