[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. }





目录
相关文章
|
2天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
18 2
基于Java+Springboot+Vue开发的服装商城管理系统
|
1天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
11 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
1天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的美容预约管理系统
基于Java+Springboot+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的美容预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
12 3
基于Java+Springboot+Vue开发的美容预约管理系统
|
2天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的房产销售管理系统
基于Java+Springboot+Vue开发的房产销售管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的房产销售管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
21 3
基于Java+Springboot+Vue开发的房产销售管理系统
|
3天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的反诈视频宣传系统
基于Java+Springboot+Vue开发的反诈视频宣传系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的反诈视频宣传管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
35 4
基于Java+Springboot+Vue开发的反诈视频宣传系统
|
1天前
|
存储 网络协议 Java
Java NIO 开发
本文介绍了Java NIO(New IO)及其主要组件,包括Channel、Buffer和Selector,并对比了NIO与传统IO的优势。文章详细讲解了FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel及Pipe.SinkChannel和Pipe.SourceChannel等Channel实现类,并提供了示例代码。通过这些示例,读者可以了解如何使用不同类型的通道进行数据读写操作。
Java NIO 开发
|
3天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的医院门诊预约挂号系统
基于Java+Springboot+Vue开发的医院门诊预约挂号系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的门诊预约挂号管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
27 2
基于Java+Springboot+Vue开发的医院门诊预约挂号系统
|
4天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的家具管理系统
基于Java+Springboot+Vue开发的家具管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的家具管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
30 2
基于Java+Springboot+Vue开发的家具管理系统
|
3天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
349 5
|
1天前
|
IDE Java 开发工具
java自定义异常20
java自定义异常20