[Java开发之路](20)try-with-resource 异常声明

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50851198 Try-with-resources是java7中一个新的异常处理机制,它能够很容易地关闭在try-catch语句块中使用的资源。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50851198

Try-with-resources是java7中一个新的异常处理机制,它能够很容易地关闭在try-catch语句块中使用的资源。

在java7以前,程序中使用的资源需要被明确地关闭,过程有点繁琐,如下所示:

 
 
  1. package com.qunar.lectures.tryResource;
  2. import java.io.*;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. /**
  6. * Created by xiaosi on 16-3-4.
  7. */
  8. public class TryResourceDemo {
  9.    // 获取资源数据
  10.    public static List<String> readLines(String resourcePath) {
  11.        String path = TryResourceDemo.class.getResource(resourcePath).getPath();
  12.        File file = new File(path);
  13.        if (!file.exists()) {
  14.            throw new RuntimeException("Can not find file + " + resourcePath);
  15.        }//if
  16.        if (!file.isFile()) {
  17.            throw new RuntimeException(resourcePath + " is not a regular file");
  18.        }//if
  19.        FileInputStream fis;
  20.        InputStreamReader isr;
  21.        BufferedReader br = null;
  22.        try {
  23.            fis = new FileInputStream(file);
  24.            isr = new InputStreamReader(fis, "UTF-8");
  25.            br = new BufferedReader(isr);
  26.            List<String> lines = new ArrayList<String>();
  27.            String line;
  28.            while ((line = br.readLine()) != null) {
  29.                lines.add(line);
  30.            }//while
  31.            return lines;
  32.        }
  33.        catch (IOException e) {
  34.            throw new RuntimeException("Read file failed , file=" + resourcePath, e);
  35.        }
  36.        finally {
  37.            if(br != null){
  38.                try {
  39.                    br.close();
  40.                } catch (IOException e) {
  41.                    e.printStackTrace();
  42.                }
  43.            }//if
  44.        }//finally
  45.    }
  46.    public static void main(String[] args) {
  47.        List<String> lines = readLines("/a.txt");
  48.        for(String line : lines){
  49.            System.out.println("line:" + line);
  50.        }//for
  51.    }
  52. }


假设try语句块抛出一个异常,然后finally语句块被执行。同样假设finally语句块也抛出了一个异常。那么哪个异常会根据调用栈往外传播?即使try语句块中抛出的异常与异常传播更相关,最终还是finally语句块中抛出的异常会根据调用栈向外传播。

 
 
  1. private static void printFileJava7() throws IOException {
  2.    try(FileInputStream input = new FileInputStream("file.txt")) {
  3.        int data = input.read();
  4.        while(data != -1){
  5.            System.out.print((char) data);
  6.            data = input.read();
  7.        }
  8.    }
  9. }

我们看到第一行:

 
 
  1. try(FileInputStream input = new FileInputStream("file.txt")) {

这就是try-with-resource 结构的用法。FileInputStream 类型变量就在try关键字后面的括号中声明并赋值。在这声明的变量我们可以在下面的代码中直接使用,即同一个作用域中。当try语句块运行结束时,FileInputStream会被自动关闭。这是因为FileInputStream 实现了java中的java.lang.AutoCloseable接口。所有实现了这个接口的类都可以在try-with-resources结构中使用。

当try-with-resources结构中抛出一个异常,同时FileInputStreami被关闭时(调用了其close方法)也抛出一个异常,try-with-resources结构中抛出的异常会向外传播,而FileInputStreami被关闭时抛出的异常被抑制了。这与文章开始处利用旧风格代码的例子(在finally语句块中关闭资源)相反。

在JDK7中只要实现了AutoCloseable或Closeable接口的类或接口,都可以使用try-with-resource来实现异常处理和资源关闭。

你可以在块中使用多个资源而且这些资源都能被自动地关闭:

 
 
  1. package com.qunar.lectures.tryResource;
  2. import java.io.*;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. /**
  6. * Created by xiaosi on 16-3-4.
  7. */
  8. public class TryResourceDemo {
  9.    // 获取资源数据
  10.    public static List<String> readLines(String resourcePath) {
  11.        String path = TryResourceDemo.class.getResource(resourcePath).getPath();
  12.        File file = new File(path);
  13.        if (!file.exists()) {
  14.            throw new RuntimeException("Can not find file + " + resourcePath);
  15.        }//if
  16.        if (!file.isFile()) {
  17.            throw new RuntimeException(resourcePath + " is not a regular file");
  18.        }//if
  19.        // try-with-resource方式 自动释放资源
  20.        try (FileInputStream fis = new FileInputStream(file);
  21.             InputStreamReader isr = new InputStreamReader(fis);
  22.                BufferedReader br = new BufferedReader(isr)){
  23.            List<String> lines = new ArrayList<String>();
  24.            String line;
  25.            while ((line = br.readLine()) != null) {
  26.                lines.add(line);
  27.            }//while
  28.            return lines;
  29.        }
  30.        catch (IOException e) {
  31.            throw new RuntimeException("Read file failed , file=" + resourcePath, e);
  32.        }
  33.    }
  34.    public static void main(String[] args) {
  35.        List<String> lines = readLines("/a.txt");
  36.        for(String line : lines){
  37.            System.out.println("line:" + line);
  38.        }//for
  39.    }
  40. }





目录
相关文章
|
12天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
11天前
|
Java API Maven
如何使用Java开发抖音API接口?
在数字化时代,社交媒体平台如抖音成为生活的重要部分。本文详细介绍了如何用Java开发抖音API接口,从创建开发者账号、申请API权限、准备开发环境,到编写代码、测试运行及注意事项,全面覆盖了整个开发流程。
54 10
|
12天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
13天前
|
IDE 前端开发 Java
怎样避免 Java 中的 NoSuchFieldError 异常
在Java中避免NoSuchFieldError异常的关键在于确保类路径下没有不同版本的类文件冲突,避免反射时使用不存在的字段,以及确保所有依赖库版本兼容。编译和运行时使用的类版本应保持一致。
|
14天前
|
Java 编译器
如何避免在 Java 中出现 NoSuchElementException 异常
在Java中,`NoSuchElementException`通常发生在使用迭代器、枚举或流等遍历集合时,尝试访问不存在的元素。为了避免该异常,可以在访问前检查是否有下一个元素(如使用`hasNext()`方法),或者使用`Optional`类处理可能为空的情况。正确管理集合边界和条件判断是关键。
|
17天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
35 4
|
18天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
48 4
|
17天前
|
Java
Java异常捕捉处理和错误处理
Java异常捕捉处理和错误处理
14 1
|
19天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
41 2
|
24天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
下一篇
无影云桌面