当前位置: 首页 > 图灵资讯 > 技术篇> 使用 finally 关键字来避免资源漏洞

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

来源:图灵教育
时间:2024-02-25 14:02:01

与其它语言模型相比,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 块必须与 try 或 try/catch 块一起使用。另外,退出是不可能的 try 块而不执行 finally 块。如果 finally 如果块存在,它将永远执行。(无论如何,这个陈述都是正确的。退出的方法有一种 try 块而不执行 finally 块。如果代码在 try 一个内部执行 System.exit(0); 句子,应用程序终止而不执行 finally 执行。另一方面,如果你在那里 try 在块执行过程中,拨掉电源,finally 也不会执行。)