java 7 try语法_java7 try-with-resources 很香

Java 7为懒惰的Java开发人员带来了一些非常好的功能。尝试资源是这种功能之一,它可以减少代码行,并使代码更健壮。在本教程中,我将讨论有关此功能的内容。

1.资源清除的旧方法(在Java 7之前)

**我们长期以来一直在这样做。例如,从文件系统读取文件。代码可能看起来有所不同,但流程如下例所示:

public class ResourceManagementBeforeJava7

{

public static void main(String[] args)

{

BufferedReader br = null;

try

{

String sCurrentLine;

br = new BufferedReader(new FileReader("C:/temp/test.txt"));

while ((sCurrentLine = br.readLine()) != null)

{

System.out.println(sCurrentLine);

}

}

catch (IOException e)

{

e.printStackTrace();

}

finally

{

try

{

if (br != null)

br.close();

}

catch (IOException ex) {

ex.printStackTrace();

}

}

}

}

这些类型的代码在具有大量IO操作的应用程序代码库中非常常见。

try和catch块中的代码本质上很重要,并且具有一些特定于应用程序的逻辑。但是,终于封锁了吗?在大多数情况下,finall块只是被复制粘贴,目的是通过关闭它们来避免损坏资源。

当您有3-4个这样的资源要在单个finally块中关闭时,这些final块看起来更难看。当我们知道时,您是否不认为这些final块不必要地存在,我们必须以任何方式关闭资源而没有任何例外情况?

Java 7通过try-with-resources功能解决了这个问题。#

2.使用try-with-resources的新方法(语法示例)

现在看看在Java 7中打开和关闭资源的新方法。

public class ResourceManagementInJava7

{

public static void main(String[] args)

{

try (BufferedReader br = new BufferedReader(new FileReader("C:/temp/test.txt")))

{

String sCurrentLine;

while ((sCurrentLine = br.readLine()) != null)

{

System.out.println(sCurrentLine);

}

}

catch (IOException e)

{

e.printStackTrace();

}

}

}

有两件事需要密切注意:

文件资源(BufferedReader)以特殊方式在try块中打开(在小括号内)。

finally块完全消失了。

最后但并非最不重要的一点是,代码看起来很漂亮且易于阅读。很好,对吗?但是它实际上是如何工作的?

3.实际如何运作?

在Java 7中,我们有一个新的超级接口java.lang.AutoCloseable**。该接口有一种方法:

void close() throws Exception;

Java文档建议此接口在不再需要时必须关闭的任何资源上实现。

当我们在特殊的try-with-resource块中打开任何此类AutoCloseable资源时,在try块完成后,JVM会对在“ try()”块中初始化的所有资源立即调用close()方法。

例如,BufferedReader已实现close()方法文件如下:

public void close() throws IOException {

synchronized (lock) {

if (in == null)

return;

in.close();

in = null;

cb = null;

}

}

由于上述方法定义,当JVM调用此方法时,所有基础流或IO资源都将关闭。

4.向自定义资源添加功能

好吧,这是一个很好的资源清理设计。但是它仅适用于JDK本机类吗?没有。您也可以将其用于自定义资源。

例如,我在以下代码中创建了一个自定义资源:

public class CustomResource implements AutoCloseable

{

public void accessResource() {

System.out.println("Accessing the resource");

}

@Override

public void close() throws Exception {

System.out.println("CustomResource closed automatically");

}

}

现在,我将在示例代码中使用它:

public class TryWithCustomResource

{

public static void main(String[] args)

{

try(CustomResource cr = new CustomResource())

{

cr.accessResource();

}

catch (Exception e)

{

e.printStackTrace();

}

}

}

Putput in console:

Accessing the resource

CustomResource closed automatically

控制台中的输出清楚地证明,try块完成后,资源将自动关闭。

5.总结

这就是Java 7中使用try-with-resources进行自动资源管理的全部内容。让我们逐点记下重点内容:

在Java 7之前,我们必须使用finally块来清理资源。最后,块不是强制性的,但是清理资源是为了防止系统损坏。

使用Java 7,无需显式的资源清理。它是自动完成的。

在try-with-resources块(try(…){…})中初始化资源时完成自动资源清理。

由于发生了新界面AutoCloseable,因此发生了清理。try块完成后,JVM将立即调用其close方法。

如果要在自定义资源中使用此功能,则必须实现AutoCloseable接口。否则程序将无法编译。

您不应在代码中调用close()方法。JVM应该自动将其称为。手动调用它可能会导致意外结果。

学习愉快!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值