惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
量子位
Recent Announcements
Recent Announcements
T
The Blog of Author Tim Ferriss
美团技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
V
Visual Studio Blog
博客园 - 聂微东
aimingoo的专栏
aimingoo的专栏
Microsoft Security Blog
Microsoft Security Blog
U
Unit 42
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
L
LangChain Blog

Java for You

AI写歌有了工程图:YuE2把旋律和和弦放回可编辑层 - Java for You - java4u Claude接入十余种金融系统后,真正稀缺的是可追溯的审批链 - Java for You - java4u 本地语音AI不等于零风险:VoiceStudio最值得看的三条边界 - Java for You - java4u AI代码评审开始跑测试,真正该升级的是团队证据链 - Java for You - java4u 4万星的Agent技能提醒我们:答案太全也可能不可用 - Java for You - java4u 流式JSON为什么总报错?理解结构化输出就能接稳AI接口 - Java for You - java4u 一个浏览器看见飞机船舶与卫星,空间智能的门槛变了 - Java for You - java4u 编码Agent搬出编辑器后,本地优先工作台在解决什么 - Java for You - java4u AI写代码开始像带团队:Qwen Code补上工作流控制台 - Java for You - java4u AI会聊天却不会改3D模型?从Pascal 1.0看懂MCP工具调用 - Java for You - java4u 让AI审科学公式,它最适合当比较员而非裁判 - Java for You - java4u 智能体上线最难的不是提示词:Agents API开始托管运行时 - Java for You - java4u AI任务一多就堵车:问题可能不在模型速度 - Java for You - java4u AI能写无人机控制代码后,安全边界不能只守提示词 - Java for You - java4u AI代码扫描能批量开了,但它还不能替你挡住合并 - Java for You - java4u 机器人动作误差降近九成,真正该先看数据切分 - Java for You - java4u 图片一多首字就慢?用EPD拆开多模态推理三段路 - Java for You - java4u 蛋白预测快2.9倍,科学AI最难的是让整条流水线不空转 - Java for You - java4u NVIDIA把供应链专家经验训练进模型,关键不是换一个更大模型 - Java for You - java4u 人人都能问公司数据之后,数据分析师反而更重要了 - Java for You - java4u 语音AI开始边听边说,改变的不只是响应速度 - Java for You - java4u Agent到底比一次大模型调用多了什么?小白从这张流程图看懂 - Java for You - java4u ChatGPT服务10亿周用户后,最难扩展的可能不是模型 - Java for You - java4u AI编码助手的日志也会泄密:先划清明文边界 - Java for You - java4u 同一套GPU多服务2.5倍用户,关键不是换模型 - Java for You - java4u NVIDIA把老师傅的判断变成了训练数据 - Java for You - java4u 4次真实越权事件提醒我们:智能体最怕认错环境 - Java for You - java4u 自动驾驶大模型开始统一看懂、建图和规划 - Java for You - java4u 开源天气模型已经很快,真正的瓶颈却在数据 - Java for You - java4u 智能体能读文件跑命令之后,企业权限该怎么管 - Java for You - java4u
【Java基础教程13】Java异常处理进阶篇 - Java for You - java4u
蜗牛 · 2022-05-29 · via Java for You

73 / 100 SEO Score

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("line.separator");
            String zipEntryName =
                 ((java.util.zip.ZipEntry)entries.nextElement()).getName() +
                 newLine;
            writer.write(zipEntryName, 0, zipEntryName.length());
        }
    }
}

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

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

原理解析

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

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

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

图片

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

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

推荐阅读:

1120页的Leetcode算法刷题笔记,完整版PDF开放下载!

《Java 工程师成神之路》.pdf

更多内容请收藏:Java for You