Effective Java笔记(9)try-with-resources 优先于 try -finally

3、数据导入与清洗:Excel、SQL、SPSS、Stata和SAS数据处理 本文详细介绍了如何从Excel文件、SQL数据库以及SPSS、Stata和SAS等统计软件中导入和清洗数据。针对不同数据来源的特点,提供了具体的处理方法,包括跳过无用行、重命名列、处理缺失值、转换数据类型、保留元数据等关键步骤。同时,通过实际应用案例展示了如何整合多源数据,并总结了数据导入和清洗的最佳实践,帮助读者高效完成数据预处理工作,为后续的数据分析打下坚实基础。 阅读详情

        Java 类库中包括许多必须通过调用 close 方法来手工关闭的资源 。 例如 InputStream 、OutputStream 和 java.sql.Connection 。 客户端经常会忽略资源 的关闭 ,造成严重的性能后果也就可想而知了 。 虽然这其中的许多资源都是用终结方法作为安全网,但是效果并不理想。

        根据经验,try -finally 语句是确保资源会被适时关闭的最佳方法,就算发生异常或者返回也一样 :

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

        这看起来好像也不算太坏,但是如果再添加第二个资源,就会一团糟了 :

static void copy(String src, String dst) throws IOException {
    InputStream in = new FileInputStream(src) ;
    try {
        OutputStream out = new FileOutputStream(dst) ;
        try {
            byte[] buf = new byte[BUFFER_ SIZE];
            int n;
            while ((n = in.read(buf)) >= 0)
                out.write(buf,0,n);
        } finally {
            out.close();
        }
    } finally {
        in.close() ;
    }
}

        这可能令人有点难以置信,不过就算优秀的程序员也会经常犯这样的错误 。

        即使用 try-finally 语句正确地关闭了资源,如前两段代码范例所示,它也存在着些许不足 。 因为在 try 块和 finally 块中的代码,都会抛出异常 。 例如在 firstLineOfFile方法中,如果底层的物理设备异常,那么调用 readLine 就会抛出异常,基于同样的原因,调用 close 也会出现异常 。 在这种情况下,第二个异常完全抹除了第一个异常 。 在异常堆枝轨迹中,完全没有关于第一个异常的记录,这在现实的系统中会导致调试变得非常复杂,因为通常需要看到第一个异常才能诊断出问题何在 。 虽然可以通过编写代码来禁止第二个异常,保留第一个异常,但事实上没有人会这么做,因为实现起来太烦琐了 。

        当 Java 7 引人 try -with-rsources 语句时,所有这些问题一下子就全部解决了 。 要使用这个构造的资源,必须先实现 AutoCloseable 接口,其中包含了单个返回 void 的 close 方法 。Java 类库与第三方类库中的许多类和接口,现在都实现或扩展了AutoCloseable 接口 。 如果编写了 一个类,它代表的是必须被关闭的资源,那么这个类也应该实现 AutoCloseable 。

        以下就是使用 try-with-resources 的第一个范例:

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

        以下是使用 try -with -resources 的第二个范例:

static void copy(String src, String dst) throws IOException {
    try (InputStream in = new FileInputStream(src);
    OutputStream out = new FileOutputStream(dst)) {
        byte[] buf = new byte[BUFFER_ SIZE];
        int n;
        while ((n = in.read(buf)) >= 0)
        out.write(buf,0,n);
    }
}

        使用 try-with-resources 不仅使代码 变得更简洁易懂,也更容易进行诊断 。以 firstLineOfFile 方法为例,如果调用 readLine 和(不可见的) close 方法都抛出异常,后一个异常就会被禁止,以保留第一个异常 。 事实上,为了保留你想要看到的那个异常,即便多个异常都可以被禁止 。 这些被禁止的异常并不是简单地被抛弃了,而是会被打印在堆枝轨迹中,并注明它们是被禁止的异常 。 通过编程调用 getSuppressed 方法还可以访问到它们,getsuppres sed 方法也已经添加在 Java 7 的 Throwable 中了 。

        在try-with-resources语句中还可以使用catch子句,就像在平时的try-finally语句中一样。这样既可以处理异常,又不需要再套用一层代码。下面举一个稍费了点心思的范例,这个firstLineOfFile方法没有抛出异常,但是如果它无法打开文件,或者无法从中读取,就会返回一个默认值:

static String firstLineOfFile(String path, String defaultVal) {
    try (BufferedReader br = new BufferedReader(
        new FileReader(path))) {
        return br.readLine();
    } catch (IOException e) {
        return defaultVal;
    }
}

        结论很明显:在处理必须关闭的资源时,始终要优先考虑用 try-with-resources ,而不是用 try-finally 。 这样得到的代码将更加简洁、清晰,产生的异常也更有价值 。 有了 try­-with-resources 语句,在使用必须关闭的资源时,就能更轻松地正确编写代码了 。 实践证明,这个用 try-finally 是不可能做到的 。

大数据工程中的数据血缘分析工具比较 数据血缘(Data Lineage)是大数据治理中的核心组成部分,它描述了数据从源头到目标的完整流动路径。系统介绍数据血缘的核心概念和技术原理比较主流开源和商业数据血缘工具的功能特点提供数据血缘分析的实践指南和选型建议本文首先介绍数据血缘的基本概念,然后深入分析其技术原理和实现方法,接着比较主流工具的特点,最后通过实际案例展示应用场景。数据血缘(Data Lineage): 描述数据从源头到目标的完整流动路径,包括所有转换和处理步骤元数据(Metadata) 阅读详情

相关推荐

别再自己造轮子了!用MONAI Model Zoo里的预训练模型,5分钟搞定医学影像AI项目

本文介绍了如何利用MONAI Model Zoo中的预训练模型快速搭建医学影像AI项目,大幅节省开发时间和计算资源。通过实战案例展示了UNet、DenseNet121等核心模型的应用技巧,帮助临床医生和研究者5分钟内启动高质量医学影像分析,特别适合小样本场景下的病灶分割和分类任务。

weixin_33704234的博客 239

Java-异常--try-with-resource和try-catch-finally

Java异常的处理 1.不对产生异常的代码进行处理,而是声明抛出(throws),交给调用者来处理,如果调用者也没有处理,则交给JVM处理,JVM通过终止程序并打印异常类型来告诉我们异常产生的原因和位置。 2.使用try-catch来处理异常,捕获异常,并对异常进行针对性的处理。 try-catch的方式就是捕获异常 捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。 捕获异常语法如下: ... try{ ... //可能出现的异常代码 } catch(异常类型

CodeANUNNAKI的博客 2545

从BUCK-BOOST到反激:一个‘拆电感’的视角,轻松理解多路输出交叉调整

本文从BUCK-BOOST电路到反激变换器的演变入手,通过‘拆解电感’的独特视角解析多路输出交叉调整机制。深入探讨了反激电路的能量暂存方式、传递路径变化及电压关系,并结合具体参数对比揭示其特性。针对多路输出中的电压平衡问题,提供了绕组排布优化、元器件选型等实战技巧,帮助工程师有效提升电源系统的稳定性与效率。

weixin_33738578的博客 437

Java 中的 `try-catch-finally` 与 `try-with-resource`

是最基本的异常处理机制。trycatch和finally。代码块放在try块中,如果在执行该块时抛出了异常,就会跳转到catch块中进行异常处理。finally块中的代码始终都会被执行,无论是否有异常发生。try块后可跟零个、一个或多个catch块,如果没有catch块,则必须跟一个finally块。finally是从Java 7开始引入的一种异常处理机制。它用于自动关闭实现了接口或的资源,如文件或网络连接,以确保它们正确地关闭,即使在发生异常时也能被关闭。使用时,我们可以在try语句中声明。

訾博(ZiBo)的博客 970

fastadmin管理员页面实现手机验证码登录功能-腾讯云短信插件

fastadmin管理员页面实现手机验证码登录功能-腾讯云短信插件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4195

大模型算法岗常见面试题100道

LangChain是一个用于构建和运行大型语言模型应用的开源框架。它提供了一套工具和组件,帮助开发者将大型语言模型(如 GPT-3)与其他工具和API结合,以完成更复杂的任务。1、LangChain包含哪些核心概念?Components:可重用的模块,例如API调用、数据库查询等。Chains:将多个Components链接在一起以完成特定任务的流程。Prompt Templates: 用于指导语言模型生成输出的文本模板。Output Parsers:解析语言模型输出的工具。

具身机器人和通用AI 1959

【第9条】try-with-resources优先于try-finally

try-with-resources优先于try-finally Java类库中包含许多必须通过调用close方法手动关闭的资源。例如InputStream,OutputStream和java.sql.Connection。客户经常会忽略资源的关闭,造成严重的性能后果也就可想而知了。虽然这其中的许多资源都是用终结方法作为安全网,但是效果并不理想(详见第8条)。 根据经验,try-finally语句是确保资源会被适时关闭的最佳方法,就算发生异常或者返回也一样 // t...

kaituozhe_sh的博客 927

YOLOv11与Roboflow数据预处理实战:从原始数据到高性能模型

摘要 Roboflow平台与YOLOv11的结合为计算机视觉开发者提供了高效的工作流。Roboflow提供数据集管理、预处理、增强和导出的一站式解决方案,支持多种标注格式并与YOLOv11无缝集成。YOLOv11在YOLO系列基础上进行了架构创新,包括深度宽度优化、C3k2机制和C2PSA注意力机制,提供从纳米版到超大版的多种模型变体。 使用Roboflow的流程包括:注册工作区、收集/导入数据(支持本地和公开数据集)、专业标注(含SAM辅助)、预处理(尺寸调整、归一化等)和数据增强(几何变换和颜色调整)。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 350

使用try-with-resources代替finally关闭资源

try-with-resources(即try(){}catch{}) 是 JDK 7 中一个新的异常处理机制,它能够很容易地关闭在 try-catch 语句块中使用的资源。所谓的资源(resource)是指在程序完成后,必须关闭的对象。try-with-resources 语句确保了每个资源在语句结束时关闭。所有实现了 java.lang.AutoCloseable 接口(其中,它...

grasp_csdn的博客 1240

【WRFDA输入数据】全球高空观测气象数据(LITTLE_R 格式数据)

【WRFDA输入数据】全球高空观测气象数据(LITTLE_R 格式数据)

WW、forever的博客 479

把 ABAP 接到外部世界的几条路, 从 Web Service 到 RFC、BAPI 与 IDoc 的完整理解

摘要: ABAP 的连接能力是其长期成为企业核心的关键,不仅支持通用协议(HTTP、SOAP、XML),还保留了 SAP 特有的技术(RFC、BAPI、IDoc)。Web Service 是跨系统通信的主轴,依赖 SOAP/WSDL 实现契约化协作,而 Enterprise Service 更强调业务语义的复用与治理。经典技术如 RFC 和 BAPI 因高效稳定仍广泛使用,尤其适合紧耦合场景。ABAP 通过分层工具箱(如代理生成、服务注册)实现灵活集成,平衡新旧技术,满足多样化的企业连接需求。 (字数:15

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 138

为什么你的finally块没执行?深度剖析try-with-resources资源顺序优先级

掌握Java 7 try-with-resources 的资源顺序,避免finally块未执行问题。详解资源关闭优先级规则,适用于多资源管理场景,确保异常情况下资源正确释放。理解底层实现机制,提升代码健壮性,值得收藏。

Instrustar的博客 1050

嵌入式面经篇八——进程&线程

记录一些招聘公司在招聘嵌入式软件岗位时的一些问题,此文为第八篇。进程上文:是指进程由用户态切换到内核态时需要保存用户态时CPU寄存器中的值,进程状态以及堆栈上的内容。即保存当前进程的状态,以便再次执行该进程时,能够恢复切换时的状态,继续执行。进程下文:是指切换到内核态后执行的程序,即进程运行在内核空间的部分。中断上文:硬件通过中断触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。

明天你好的博客 1854

《Effective Java》第9条:try-with-resources 优先于 try-finally

例如,在firstLineOfFile方法中,如果底层的物理设备异常,那么调用 reaLine 就会抛出异常,基于同样的原因调用 close 也会出现异常。在日常编码中,我们还有一种方式来手动关闭资源,那就是 try-finally 的方式,那么这两种方式各自的优势是什么,什么场景下使用,我们今天就来讨论下。这里没法做试验演示,我们只需要知道这个问题就可以,由于finally块中的异常抹除了try块中的异常,会让我们误以为是在close的时候出现的问题。这种方式看起来没啥问题,但其实,这段代码是有问题的。

TD_FAlmK的博客 679

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

try-with-resources优先try-finally《Effective java第二章第九条》

对于 《Effective java第二章第九条》 try-with-resources优先try-finally 进行学习与总结

qq_47129343的博客 717

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Effective Java – Item 9 try-with-resources 优先于 try-finally

item9 · try-with-resources 优先于 try-finally try-with-resources 可以更好地解决资源关闭问题 例子 static void copy(String src, String dst) throws IOException { try (InputStream in = new FileInputStream(src);...

AlbumenJ的博客 176

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

《Effective Java》解读第9条:try-with-resources 优先于 try-finally

摘要:Java应优先使用try-with-resources替代try-finally进行资源管理。优势包括:1)代码更简洁,自动关闭资源无需finally块;2)异常处理更完善,不会覆盖原始异常;3)支持多资源自动按逆序关闭;4)所有实现AutoCloseable接口的资源均可使用。相比try-finally,try-with-resources能减少代码量、避免资源泄漏、保留完整异常链,仅在处理非AutoCloseable资源时才考虑传统方式(但极少需要)。

Cosmoshhhyyy的博客 348

effective java 第9条:try-with-resources优先于try-finally

在处理必须关闭的资源时,始终要优先考虑用try-with-resources,而不是try-finally 。这样得到的代码将更加的简洁、清晰,产生的异常也更加有价值

passerby64的博客 215

为什么《Effective Java 第三版》推荐使用try-with-resources代替try-finally

背景 try-finally 这个语句想必做java的同学都不陌生吧,每当我们有关闭资源的需求我们都会使用到try-finally这个语句,比如我们在使用锁的时候,无论是本地的可重入锁还是...

华章IT官方博客 419

为什么effective java 第三版推荐使用try-with-resources代替try-finally

背景 try-finally 这个语句想必做java的同学都不陌生吧,每当我们有关闭资源的需求我们都会使用到try-finally这个语句,比如我们在使用锁的时候,无论是本地的可重入锁还...

lizhao007 279

《Effective Java》第9条:try-with-resources优先于try-finally

在处理必须关闭的资源时,优先考虑try-with-resources。这样写的代码简洁、清晰,产生的异常也更有参考价值。

ln_ydc的专栏 351

《Effective Java》-- 使用try-with-resources关闭资源

Java类库里包含了必须通过调用close方法来手动关闭的资源。比如InputStream,OutputStream还有java.sql.Connection。 关闭资源这个动作通常被客户端忽视了,其性能表现也可想而知。虽然大部分这些资源都使用终结方法作为最后的安全线,但终结方法的效果并不是很好。 Java SE 7之前 在过去(Java7之前)的实践当中,try-finally语句是保证一...

求关注 624

Effective Java -- 创建和销毁对象 -- try-with-resources优先于try-finally

第二章 创建和销毁对象 第九条 try-with-resources优先于try-finally 在处理必须关闭的资源时,始终要优先考虑用try-with-resource,而不是用try-finally。 这样得到的代码将更加简洁、清晰,产生的异常也更有价值。

weixin_43164759的博客 306

effective.java.9 使用 try-with-resources 语句替代 try-finally 语句

当用java打开了一个外部资源(数据库连接、文件等)时,使用完毕后必须手动关闭它,因为外部资源不手JVM管理,如果不手动关闭它,就会导致文件被异常占用,数据库连接过多等问题。 通常,try-finally语句是关闭外部资源最好的方式: public void test1(String path) throws IOException { BufferedReader br = new Buf...

JWT的博客 303

Effective Java---09 使用 try-with-resources 语句替代 try-finally 语句

为什么要使用try-finally Java类库中包含许多必须通过调用close()方法手动关闭的资源,比如“InputStream”、“OutputStream”以及数据库连接Connection,开发者可能会忘记关闭资源,这是肯定会影响性能的。尽管这些资源中有很多使用了finalizer机制作为安全网,但是该机制并不能很好的工作。 从以往来看,try-finally 语句是保证资源正确关闭的最佳方式,即使是在程序抛出异常或返回的情况下: // try-finally - No longer the be

weixin_44212383的博客 353

Effective Java【创建和销毁对象篇】 第9条 try-with-resources优先于try-finally

try-with-resources优先于try-finally try-with-resources是jdk1.7引入的语法糖,使得关闭资源操作无需层层嵌套在finally。 Jav类库中包括许多调用close方法来手工关闭资源。例如:InputStream、OutputStream和java.sql.Connection。客户端经常会忽略资源的关闭,造成严重的性能后果,虽然这其中的许多资源都是用终结方法作为安全网,但是效果并不是很理想。 根据经验:try-finally语句是确保资源会被适时关闭的最

zhangxiaoxiao9527的博客 256
上一篇: Effective Java笔记(8)避免使用终结方法和清除方法
下一篇: Java8函数式编程(Lambda表达式)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值