科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Java编程十大典型问题详解

Java编程十大典型问题详解

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

 在调用资源之前,第一件事情是必须分配资源。无论是二进制流还是字符流,一旦在生成流时被打开,直到Close方法被调用之前,流所使用的资源都处于被占用的状态。

作者:黑咖啡 来源:IT专家网 2008年5月11日

关键字: 问题 典型 编程 java

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

  JAVA

  经常发生的一件事是,在进行文件操作时,打开的文件必须及时关闭。无论是二进制流还是字符流,一旦在生成流时被打开,直到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();
  }
  }
  }
  补充说明:通过垃圾回收机制释放对象

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

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

  详细内容可以参考该文章的补充5。吴华鹏

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章