Java 7用于自动资源管理的try-with-resources语句

今天,我们将研究Java试用资源。Java 7的功能之一是用于自动资源管理的try-with-resources语句。

资源是一个对象,一旦您的程序完成使用它就必须关闭它。例如,用于数据库连接或套接字连接资源的文件资源或JDBC资源。在Java 7之前,没有自动资源管理,一旦完成工作,我们就应该明确关闭资源。通常,它是在语句块中完成的。当我们忘记关闭资源时,这种方法曾经导致内存泄漏和性能下降。finallytry-catch

让我们看一个伪代码片段,以了解此Java资源尝试功能。

在Java 7之前

 

try{

       //open resources like File, Database connection, Sockets etc

} catch (FileNotFoundException e) {

       // Exception handling like FileNotFoundException, IOException etc

}finally{

       // close resources

}

Java 7尝试使用资源实现

 

try(// open resources here){

    // use resources

} catch (FileNotFoundException e) {

       // exception handling

}

// resources are closed as soon as try-catch block is executed.

让我们编写一个简单的程序来读取文件并使用Java 6或更早版本和Java 7 try-with-resources实现打印第一行。

Java 6资源管理示例

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;

 

public class Java6ResourceManagement {

 

        public static void main(String[] args) {

                 BufferedReader br = null;

                 try {

                         br = new BufferedReader(new FileReader("C:\\Users\\Administrator\\hello.bat"));

                         System.out.println(br.readLine());

                 } catch (IOException e) {

                         e.printStackTrace();

                 } finally {

                         try {

                                  if (br != null)

                                           br.close();

                         } catch (IOException ex) {

                                  ex.printStackTrace();

                         }

                 }

        }

}

 

Java 7试用资源示例

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;

 

public class Java7ResourceManagement {

 

    public static void main(String[] args) {

        try (BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\Administrator\\hello.bat"))) {

            System.out.println(br.readLine());

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

 

 

Java尝试利用资源优势

在Java中对资源使用try的一些好处是;

  1. 更具可读性的代码,易于编写。
  2. 自动资源管理。
  3. 代码行数减少。
  4. 无需最终阻塞即可关闭资源。
  5. 我们可以在以分号分隔的try-with-resources语句中打开多个资源。例如,我们可以编写以下代码:
  6.  
  7. try (BufferedReader br = new BufferedReader(new FileReader(
  8.                               "C:\\journaldev.txt"));
  9.                               java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(FileSystems.getDefault().getPath("C:\\journaldev.txt"), Charset.defaultCharset())) {
  10.                       System.out.println(br.readLine());
  11.                } catch (IOException e) {
  12.                       e.printStackTrace();
  13.                }
  14. 当在try-with-resources中打开多个资源时,它将以相反的顺序关闭它们,以避免任何依赖关系问题。您可以扩展我的资源计划以证明这一点。

Java 7引入了新接口java.lang.AutoCloseable。要在try-with-resources中使用任何资源,它必须实现AutoCloseable接口,否则Java编译器将抛出编译错误。

让我们用一个例子来确认这一点:

 

 

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;

import java.nio.charset.Charset;

import java.nio.file.FileSystems;

 

public class Java7ResourceManagement {

 

       public static void main(String[] args) {

 

               try (MyResource mr = new MyResource()) {

                      System.out.println("MyResource created in try-with-resources");

               } catch (Exception e) {

                      e.printStackTrace();

               }

               System.out.println("Out of try-catch block.");

       }

 

       static class MyResource implements AutoCloseable{

 

               @Override

               public void close() throws Exception {

                      System.out.println("Closing MyResource");

               }

 

       }

}

上面程序的输出是:

 

MyResource created in try-with-resources

Closing MyResource

Out of try-catch block.

从输出中很明显,一旦try-catch块完成,就将调用资源关闭方法。

尝试使用资源异常

在出现异常的情况下,try-catch-finally和try-with-resources之间有一个区别。

如果在try块和finally块中都抛出了异常,则该方法返回在finally块中抛出的异常。

对于try-with-resources,如果在try块和try-with-resources语句中引发了异常,则该方法将返回在try块中引发的异常。

为了更好地阐明这种差异,我们将看到示例代码。

 

 

public class Java7ResourceManagement {

 

       public static void main(String[] args) throws Exception {

               try {

                      tryWithResourceException();

               } catch (Exception e) {

                      System.out.println(e.getMessage());

               }

               try {

                      normalTryException();

               } catch (Exception e) {

                      System.out.println(e.getMessage());

               }

       }

 

       private static void normalTryException() throws Exception {

               MyResource mr = null;

               try {

                      mr = new MyResource();

                      System.out.println("MyResource created in the try block");

                      if (true)

                              throw new Exception("Exception in try");

               } finally {

                      if (mr != null)

                              mr.close();

               }

 

       }

 

       private static void tryWithResourceException() throws Exception {

               try (MyResource mr = new MyResource()) {

                      System.out.println("MyResource created in try-with-resources");

                      if (true)

                              throw new Exception("Exception in try");

               }

       }

 

       static class MyResource implements AutoCloseable {

 

               @Override

               public void close() throws Exception {

                      System.out.println("Closing MyResource");

                      throw new Exception("Exception in Closing");

               }

 

       }

}

上面程序的输出是:

 

MyResource created in try-with-resources

Closing MyResource

Exception in try

MyResource created in the try block

Closing MyResource

Exception in Closing

程序的输出证明了上面给出的差异。这就是Java 7 try-with-resources的全部内容。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值