搜索
写经验 领红包
 > 知识

java异常处理规则(新手必看)(java异常处理的三种方法)

导语:Java 异常处理一览 | 进阶篇

java异常处理规则(新手必看)(java异常处理的三种方法)

前言

《Java 异常处理一览 | 基础篇》介绍了 Java 异常处理的一些基本操作,本文介绍下异常处理的一些进阶操作!

try-with-resources 语句

我们在对一些资源进行操作时,经常会有固定的写法:

try 中打开资源finally 中关闭资源

比如下面这个程序:

static String readFirstLineFromFileWithFinallyBlock(String path)                                                     throws IOException {        BufferedReader br = new BufferedReader(new FileReader(path));        try {        return br.readLine();            } finally {        br.close();            }}

程序示例是从文件中读取第一行。它使用 BufferedReader 实例从文件中读取数据,这是一个必须在程序完成后关闭的资源。

在 Java SE 7 之前,对资源的操作只能通过上边比较繁琐的代码实现,也就是使用 finally 块确保关闭资源。

但 Java SE 7 之后,使用 try-with-resources 语句就可以做到无需在 finally 块中显式关闭资源,不管 try 语句是正常完成还是异常阻断,资源都会被自动关闭!写法如下:

static String readFirstLineFromFile(String path) throws IOException {    try (BufferedReader br =                   new BufferedReader(new FileReader(path))) {        return br.readLine();    }}

你会发现,try 语句多了一对圆括号,圆括号里能塞表达式,表达式里其实就是对资源的声明。

多资源处理

这时候你可能会问,如果 try 中我有多个资源要声明怎么办呢?

可以用分号分割。

像下面这样:

public static void writeToFileZipFileContents(String zipFileName,                                           String outputFileName)                                           throws java.io.IOException {    java.nio.charset.Charset charset =         java.nio.charset.StandardCharsets.US_ASCII;    java.nio.file.Path outputFilePath =         java.nio.file.Paths.get(outputFileName);    // Open zip file and create output file with     // try-with-resources statement    try (        java.util.zip.ZipFile zf =             new java.util.zip.ZipFile(zipFileName);        java.io.BufferedWriter writer =             java.nio.file.Files.newBufferedWriter(outputFilePath, charset)    ) {        // Enumerate each entry        for (java.util.Enumeration entries =                                zf.entries(); entries.hasMoreElements();) {            // Get the entry name and write it to the output file            String newLine = System.getProperty(&34;);            String zipEntryName =                 ((java.util.zip.ZipEntry)entries.nextElement()).getName() +                 newLine;            writer.write(zipEntryName, 0, zipEntryName.length());        }    }}

进入 try 代码块的执行后,无论是正常还是异常,当代码块终止时,BufferedWriter 和 ZipFile 的 close 方法会依次被调用,从而达到自动关闭资源的效果。

注意:资源的 close 方法的调用顺序和它创建顺序相反,这个也好理解,你把 try 中涉及的所有资源想象依次放到一个比较窄的池子里,那这就像队列一样,先进后出,先创建的最后关闭资源。

原理解析

此时,你可能会问,为什么示例中的资源会被自动关闭资源呢?

最直接的原因就是,他们都有关闭资源的方法。

根本原因是,它们都实现了 AutoCloseable 的接口,具备了 close 的能力。

见名知意,AutoCloseable 也表明了实现它接口的对象,都具备自动关闭自己的能力。看注释,since 1.7,你也能知道,这个能力的确是从 Java 7 开始的。

所以,如果你有自定义资源,记得要实现 AutoCloseable。

我是蜗牛,大厂程序员,专注技术原创和个人成长,正在互联网上摸爬滚打。欢迎关注我,和蜗牛一起成长,我们一起牛~下期见!


本文内容由小茜整理编辑!