使用 finally 关键字来避免资源漏洞

原创 2001年05月04日 13:31:00

与其他语言的模型相比,finally 关键字是对 Java 异常处理模型的最佳补充。 finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源。如果没有 finally,您的代码就会很费解。例如,下面的代码说明,在不使用 finally 的情况下您必须如何编写代码来释放非内存资源:

import java.net.*;
import java.io.*;

class WithoutFinally
{
  public void foo() throws IOException
  {
    //在任一个空闲的端口上创建一个套接字
    ServerSocket ss = new ServerSocket(0);
    try {
      Socket socket = ss.accept();
      //此处的其他代码...
    }
    catch (IOException e) {
      ss.close();                                             //1
      throw e;
    }

    //...
    ss.close();                                               //2
  }
}

这段代码创建了一个套接字,并调用 accept 方法。在退出该方法之前,您必须关闭此套接字,以避免资源漏洞。为了完成这一任务,我们在 //2 处调用 close,它是该方法的最后一条语句。但是,如果 try 块中发生一个异常会怎么样呢?在这种情况下,//2 处的 close 调用永远不会发生。因此,您必须捕获这个异常,并在重新发出这个异常之前在 //1 处插入对 close 的另一个调用。这样就可以确保在退出该方法之前关闭套接字。

这样编写代码既麻烦又易于出错,但在没有 finally 的情况下这是必不可少的。不幸的是,在没有 finally 机制的语言中,程序员就可能忘记以这种方式组织他们的代码,从而导致资源漏洞。Java 中的 finally 子句解决了这个问题。有了 finally,前面的代码就可以重写为以下的形式:

import java.net.*;
import java.io.*;

class WithFinally
{
  public void foo2() throws IOException
  {
    //在任一个空闲的端口上创建一个套接字
    ServerSocket ss = new ServerSocket(0);
    try {
      Socket socket = ss.accept();
      //此处的其他代码...
    }
    finally {
      ss.close();
    }
  }
}

finally 块确保 close 方法总被执行,而不管 try 块内是否发出异常。因此,可以确保在退出该方法之前总会调用 close 方法。这样您就可以确信套接字被关闭并且您没有泄漏资源。在此方法中不需要再有一个 catch 块。在第一个示例中提供 catch 块只是为了关闭套接字,现在这是通过 finally 关闭的。如果您确实提供了一个 catch 块,则 finally 块中的代码在 catch 块完成以后执行。

finally 块必须与 trytry/catch 块配合使用。此外,不可能退出 try 块而不执行其 finally 块。如果 finally 块存在,则它总会执行。(无论从那点看,这个陈述都是正确的。有一种方法可以退出 try 块而不执行 finally 块。如果代码在 try 内部执行一条 System.exit(0); 语句,则应用程序终止而不会执行 finally 执行。另一方面,如果您在 try 块执行期间拨掉电源,finally 也不会执行。)

JDBC如何有效防止SQL注入

JDBC批量插入数据优化,使用addBatch和executeBatch 在之前的玩转JDBC打造数据库操作万能工具类JDBCUtil,加入了高效的数据库连接池,利用了参数绑定有效防止SQL注入 ...
  • u010785585
  • u010785585
  • 2016年12月21日 07:53
  • 2834

SSI 注入的介绍和代码防御

0x01 介绍 当符合下列条件时,攻击者可以在 Web 服务器上运行任意命令: A. Web 服务器已支持 SSI(服务器端包含)。 B. Web 应用程序在返回 HTML 页面时,嵌入用户输...
  • qq_29277155
  • qq_29277155
  • 2016年10月07日 19:53
  • 1713

Android:你不知道的 WebView 使用漏洞

前言 现在很多App里都内置了Web网页(Hyprid App),比如说很多电商平台,淘宝、京东、聚划算等等,如下图上述功能是由 Android的WebView 实现的,但是 WebView 使用过程...
  • carson_ho
  • carson_ho
  • 2017年03月22日 09:13
  • 35758

建议69:应使用finally避免资源泄漏

建议69:应使用finally避免资源泄漏 除非发生让应用程序中断的异常,否则finally总是会先于return执行。finally的这个语言特性决定了资源释放的最佳位置就是在finally块...
  • houwc
  • houwc
  • 2016年09月07日 10:56
  • 128

finally关键字说明及使用<整理>

与其他语言的模型相比,finally 关键字是对 Java 异常处理模型的最佳补充。finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内...
  • qq_31176803
  • qq_31176803
  • 2016年04月26日 09:36
  • 76

try 与 catch finally关键字

  • 2014年06月20日 14:28
  • 26KB
  • 下载

可以使用 using 或者 try-catch-finally 调用 Dispose() 来释放非托管资源

转自http://www.cnblogs.com/yuliantao/archive/2011/01/11/1933384.html   1.我们常使用IDisposable接口的Dispose(...
  • peng_bin1989
  • peng_bin1989
  • 2012年10月18日 16:48
  • 896

异常处理——使用finally回收资源

有时候,程序在try块里打开了一些物理资源(例如数据库连接 、网络连接和磁盘文件等),这些物理资源都必须显示回收,因为Java的垃圾回收机制不会回收任何物力资源,垃圾回收机制只能回收堆内存中对象所占用...
  • wqe198612
  • wqe198612
  • 2013年10月10日 17:28
  • 289

【火线解码】001.避免在finally语句块中使用return语句

火线团队推出【火线解码】系列文章,每一篇解释一种不规范的代码写法,用较短的篇幅让大家快速的了解代码规范问题。 001.避免在finally语句块中使用return语句错误的代码示例:public cl...
  • oggboy
  • oggboy
  • 2017年06月26日 17:14
  • 153

【.Net码农】c#:使用using关键字自动释放资源未必一定就会有明显好处

http://www.cnblogs.com/yjmyzz/archive/2011/10/27/2227091.html c#:使用using关键字自动释放资源未必一定就会有明显好...
  • CrackLibby
  • CrackLibby
  • 2015年08月07日 10:16
  • 1704
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用 finally 关键字来避免资源漏洞
举报原因:
原因补充:

(最多只允许输入30个字)