文章目录

  • 1. 异常处理与优化
    • 1.1 在文件操作中使用 `try-catch`
    • 1.2 `try-with-resources` 语法
    • 1.3 使用 `finally `块关闭资源
    • 1.4 代码健壮性与优化
  • 2. 实践任务
    • 2.1 改进思路
    • 2.2 示例改进要点
    • 2.3 检查点
  • 3. 总结
    • 3.1 改进后的完整代码:
  • 4. 今日生词

今日学习目标:
第 6 天:异常处理与优化
学习内容
在文件操作中使用 try-catch 处理异常:
try-with-resources 语法(try (BufferedReader br = new BufferedReader(new FileReader(“test.txt”)))。
优化文件操作代码,提高健壮性:
使用 finally 关闭资源,避免内存泄漏。
实践任务
改进前一天的文件管理工具:
处理异常,如 IOException 和 FileNotFoundException。
使用 try-with-resources 确保资源关闭。

1. 异常处理与优化

1.1 在文件操作中使用 try-catch

  • 基本结构
try {// 可能抛出异常的代码
} catch (IOException e) {// 对 IOException 的处理
}
  • 常见异常类型
    • FileNotFoundException:当要读取的文件不存在时抛出
    • IOException:文件读写过程中的其他 I/O 异常
  • 使用场景
    • 在文件读取(如 FileReaderBufferedReader)时捕获 IOException
    • 在文件写入(如 FileWriterBufferedWriter)时捕获 IOException

1.2 try-with-resources 语法

  • 语法示例
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}
} catch (IOException e) {e.printStackTrace();
}
  • 优势
    • 自动关闭资源:try-with-resources 块结束时,Java 会自动调用资源的close()方法
    • 代码更简洁:省去显式的 finally 块来关闭流

1.3 使用 finally 块关闭资源

  • 传统方式
BufferedReader br = null;
try {br = new BufferedReader(new FileReader("test.txt"));// 文件读取操作
} catch (FileNotFoundException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();
} finally {if (br != null) {try {br.close();} catch (IOException e) {e.printStackTrace();}}
}
  • 适用场景
    • 在无法使用 try-with-resources 的情况(例如,Java 版本限制)
    • 需要在finally块中进行其他清理操作时

1.4 代码健壮性与优化

1.捕获并分类处理异常

  • 将不同异常类型分开处理或给予不同提示,便于用户理解问题所在
    2.提供用户友好提示
  • 异常信息中应包含具体原因,方便排查问题
    3.减少重复代码
  • 将重复的异常处理逻辑提取到方法中,或使用工具类封装

2. 实践任务

改进前一天的文件管理工具

  • 处理异常,如 IOExceptionFileNotFoundException
  • 使用 try-with-resources 确保资源关闭

2.1 改进思路

1.使用try-with-resources替换原有的 try-catch-finally

  • 在读取文件 (readFile) 和写入文件 (writeFile) 方法中,使用 try-with-resources 自动关闭流。
    2.更加细化的异常捕获
  • 在文件读取时分别捕获 FileNotFoundException(若文件不存在,给出提示)
  • 捕获 IOException(若读写出错,也能给出相应提示)
    3.保持程序逻辑不变
  • 依然允许用户创建文件、读取内容、修改内容后保存等操作,只是让异常处理更健壮。

2.2 示例改进要点

  • 示例:readFile(File file) 方法
public static void readFile(File file) {// try-with-resources 会自动关闭 BufferedReadertry (BufferedReader reader = new BufferedReader(new FileReader(file))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (FileNotFoundException e) {System.out.println("文件未找到: " + e.getMessage());} catch (IOException e) {System.out.println("读取文件失败: " + e.getMessage());}
}
  • 示例:writeFile(File file, String content) 方法
public static void writeFile(File file, String content) {// 同样使用 try-with-resourcestry (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {writer.write(content);System.out.println("文件已保存。");} catch (IOException e) {System.out.println("写入文件失败: " + e.getMessage());}
}
  • 在其他需要文件操作的地方也可类比使用

2.3 检查点

1.测试文件不存在的情况

  • 输入一个不存在的路径,看是否能提示“文件未找到”,并在用户选择创建后正常创建。
    2.测试文件读取失败情况
  • 例如手动给文件设置只读,或放在不可访问的目录下,是否能捕获 IOException。
    3.测试修改保存功能
  • 修改文件内容后保存,看是否正确写入且资源关闭无误。

3. 总结

  • 通过使用 try-catchtry-with-resources 以及 finally
    你可以有效地处理文件读写过程中出现的各种异常,并确保资源得到正确释放。
  • 改进后的文件管理工具更健壮
    当用户输入了错误路径或在读写文件时遇到问题时,程序能给出清晰的提示,并且不会造成资源泄漏。
  • 后续学习方向
  • 更深入的异常体系:自定义异常、异常链等
  • 更复杂的文件操作:如多线程读写、大文件分块处理等

3.1 改进后的完整代码:

import java.io.*;
import java.util.Scanner;public class FileManager {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入文件路径:");String filePath = scanner.nextLine();File file = new File(filePath);if (file.exists()) {// 文件存在,读取并显示内容System.out.println("文件存在,内容如下:");readFile(file);System.out.println("是否需要修改文件内容? (yes/no)");String response = scanner.nextLine();if (response.equalsIgnoreCase("yes") || response.equalsIgnoreCase("y")) {System.out.println("请输入新的内容(输入单独一行 exit 表示结束):");String newContent = readMultilineInput(scanner);writeFile(file, newContent);} else {System.out.println("不修改文件内容,程序结束。");}} else {// 文件不存在,询问是否创建新文件System.out.println("文件不存在,是否创建新文件? (yes/no)");String response = scanner.nextLine();if (response.equalsIgnoreCase("yes") || response.equalsIgnoreCase("y")) {// 检查并创建父目录File parentDir = file.getParentFile();if (parentDir != null && !parentDir.exists()) {if (parentDir.mkdirs()) {System.out.println("父目录创建成功。");} else {System.out.println("父目录创建失败,请检查路径和权限。");}}try {if (file.createNewFile()) {System.out.println("文件创建成功。");System.out.println("请输入要写入文件的内容(输入单独一行 exit 表示结束):");String content = readMultilineInput(scanner);writeFile(file, content);} else {System.out.println("文件创建失败或文件已存在。");}} catch (IOException e) {System.out.println("文件创建失败: " + e.getMessage());}} else {System.out.println("未创建文件,程序结束。");}}scanner.close();}// 方法:使用 try-with-resources 读取文件内容并显示到控制台public static void readFile(File file) {try (BufferedReader reader = new BufferedReader(new FileReader(file))) {String line;System.out.println("------ 文件内容开始 ------");while ((line = reader.readLine()) != null) {System.out.println(line);}System.out.println("------ 文件内容结束 ------");} catch (FileNotFoundException e) {System.out.println("文件未找到: " + e.getMessage());} catch (IOException e) {System.out.println("读取文件失败: " + e.getMessage());}}// 方法:使用 try-with-resources 将内容写入文件public static void writeFile(File file, String content) {try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {writer.write(content);System.out.println("文件已保存。");} catch (IOException e) {System.out.println("写入文件失败: " + e.getMessage());}}// 方法:读取多行输入,以单独一行 "exit" 作为结束标识public static String readMultilineInput(Scanner scanner) {StringBuilder content = new StringBuilder();String line;while (!(line = scanner.nextLine()).equals("exit")) {content.append(line).append(System.lineSeparator());}return content.toString();}
}
  • 代码改进要点
    1.父目录创建
    在创建新文件前,先判断文件的父目录是否存在,若不存在则调用 parentDir.mkdirs() 创建多级目录,确保路径正确。

2.使用 try-with-resources
在读取与写入文件时都使用 try-with-resources 语法,确保在操作完成后自动关闭流,避免资源泄漏。

3.异常细化处理
分别捕获 FileNotFoundException 和 IOException,为用户提供更清晰的错误提示。

4. 今日生词

1.bacteria 2.motivate 3.ingredient 4.commercial 5.penalty

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/73139.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/73139.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/73139.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ajax组件是什么

在 Vue 项目中与后端接口通信,通常有以下几种常用的方式和组件: ### 1. **使用 Axios 进行 HTTP 请求** Axios 是一个基于 Promise 的 HTTP 客户端,适用于浏览器和 Node.js 环境。它支持请求和响应拦截、自动转换 JSON 数据、取消请求等功能…

C# WPF 基础知识学习(二)

四、数据绑定 (一)数据绑定基础 绑定源和目标:数据绑定建立了 UI 元素(绑定目标)属性与数据源(绑定源)之间的联系。例如,将一个TextBox的Text属性绑定到一个对象的某个属性上。绑定…

Trae AI IDEA安装与使用

文章目录 背景第一步、下载安装第二步、登录与使用优势异常处理 背景 最近比较热的 Trae 开发工具,在本地下载使用,记录下来。 第一步、下载安装 下载地址:【Trae中文版下载地址】,下载的安装文件名为:【Trae CN-Se…

Ubuntu22.04安装数据

数据库安装步骤: sudo apt-get update sudo apt install mysql-server mysql-client sudo systemctl start mysql sudo systemctl status mysql (1)在命令行登录 MySQL 数据库,并使用 mysql 数据库 (必须使用这个…

【LangChain接入阿里云百炼deepseek】

这是目录 前言阿里云百炼注册账号使用代码执行结果 前言 大模型爆火,现在很多教程在教怎么使用大模型来训练Agent智能体,但是大部分教程都是使用的OpenAI。 最近阿里云推出DeepSeek-R1满血版,新用户可享100万免费Token额度。 今天就教大家怎…

火绒企业版V2.0全面支持Linux与国产化系统!免费试用助力国产化终端安全升级

国产化浪潮下的安全新挑战 随着信创产业的加速推进,国产操作系统(统信UOS、麒麟OS等)和ARM架构服务器逐步成为政企核心业务的基础设施。然而,针对国产化系统的勒索攻击、网页篡改、供应链漏洞等威胁频发,传统安全方案…

【HarmonyOS Next】鸿蒙加固方案调研和分析

【HarmonyOS Next】鸿蒙加固方案调研和分析 一、前言 根据鸿蒙应用的上架流程,本地构建app文件后,上架到AGC平台,平台会进行解析。根据鸿蒙系统的特殊设置,仿照IOS的生态闭环方案。只能从AGC应用市场下载app进行安装。这样的流程…

【前端拓展】Canvas性能革命!WebGPU + WebAssembly混合渲染方案深度解析

为什么需要混合方案? 真实场景痛点分析: 传统WebGL在高频数据更新时存在CPU-GPU通信瓶颈JavaScript的垃圾回收机制导致渲染卡顿复杂物理模拟(如SPH流体)难以在单线程中实现 技术选型对比: graph LRA[计算密集型任务…

win11编译llama_cpp_python cuda128 RTX30/40/50版本

Geforce 50xx系显卡最低支持cuda128,llama_cpp_python官方源只有cpu版本,没有cuda版本,所以自己基于0.3.5版本源码编译一个RTX 30xx/40xx/50xx版本。 1. 前置条件 1. 访问https://developer.download.nvidia.cn/compute/cuda/12.8.0/local_…

【Python运维】实现高效的自动化备份与恢复:Python脚本从入门到实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在信息化时代,数据备份和恢复的有效性对企业和个人来说至关重要。本文将带领读者深入了解如何使用Python编写自动化备份与恢复脚本,确保重…

Electron应用中获取设备唯一ID和系统信息

让我创建一篇关于如何在Electron应用中获取设备唯一ID和系统信息,并在登录时使用这些信息的博客文章。我将确保步骤明确、条理清晰,适合初学者和有经验的开发者。 这篇博客应包含以下部分: 介绍 - 为什么需要获取设备信息前提条件和安装依赖…

【每日学点HarmonyOS Next知识】自定义对话框关闭、WaterFlow嵌套、状态栏颜色、滚动吸附、滚动动效

1、HarmonyOS 自定义对话框自动关闭的问题? 启动页做了个隐私协议弹窗,autoCancel为false。UI中使用 Text() ContainerSpan() Span()组件,设置了点击事件,点击后使用router.pushUrl()的方法跳转到协议页面。点击时,对…

【物联网-WIFI】

物联网-WIFI ■ ESP32-C3-模块简介■ ESP32-C3-■ ESP32-C3-■ WIFI-模组■ WIFI-■ WIFI- ■ ESP32-C3-模块简介 ■ ESP32-C3- ■ ESP32-C3- ■ WIFI-模组 ■ WIFI- ■ WIFI-

Xilinx ZYNQ FSBL解读:LoadBootImage()

篇首 最近突发奇想,Xilinx 的集成开发环境已经很好了,很多必要的代码都直接生成了,这给开发者带来了巨大便利的同时,也让人错过了很多代码的精彩,可能有很多人用了很多年了,都还无法清楚的理解其中过程。博…

LeetCode1871 跳跃游戏VII

LeetCode 跳跃游戏 IV:二进制字符串的跳跃问题 题目描述 给定一个下标从 0 开始的二进制字符串 s 和两个整数 minJump 和 maxJump。初始时,你位于下标 0 处(保证该位置为 0)。你需要判断是否能到达字符串的最后一个位置&#xf…

Burpsuite使用笔记

Burpsuite使用笔记 抓包设置代理open Browserintercept on输入要抓包的网站回车ForwardHTTP history查看抓包数据其他浏览器配置burpsuite代理浏览器代理器插件配置打开代理同样步骤访问原理三级目录抓包 设置代理 open Browser 打开内置浏览器 intercept on 输入要抓包的网…

Windows 远程桌面多端口访问,局域网虚拟IP映射多个Windows 主机解决方案

情景 项目现场4G路由局域网中两台主机通过VPN连接到公司内网,实现远程管理,要求映射两个Windows 桌面进行管理。 目录 情景 网络 思路 已知 问题解决 1.客户端通过VPN进入内网路由器配置NAT 2.使用远程主机远程桌面功能:IP端口号访问 …

【深度学习】读写文件

读写文件 到目前为止,我们讨论了如何处理数据,以及如何构建、训练和测试深度学习模型。 然而,有时我们希望保存训练的模型,以备将来在各种环境中使用(比如在部署中进行预测)。 此外,当运行一个…

仿Manus一

复制 ┌───────────────┐ ┌─────────────┐ │ 主界面UI │◄─────►│ 会话管理模块 │ └───────┬───────┘ └──────┬──────┘│ │▼ ▼ ┌─…

VS Code C++ 开发环境配置

VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…