Java学习——day20

文章目录

  • 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.rhkb.cn/news/32369.html

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

相关文章

Spring AI与DeepSeek实战二:打造企业级智能体

一、概述 智能体 Agent 能自主执行任务实现特定目标的 AI 程序。传统 AI(如ChatGPT)主要依靠用户输入指令,而智能体 Agent 可以自主思考、决策,并执行复杂任务,就像一个AI助手,能够独立完成多步操作。本文…

【C++】 —— 笔试刷题day_3

刷题_day3 继续加油!!! 一、简写单词 题目链接:简写单词 题目描述 这道题比较简单,题目说的也非常简单明了 输入一行复合词,要求我们输出每个单词的首字母大写。 算法思路 这里我们可以看到输入的复合词…

数学建模:MATLAB强化学习

一、强化学习简述 强化学习是一种通过与环境交互,学习状态到行为的映射关系,以获得最大积累期望回报的方法。包含环境,动作和奖励三部分,本质是智能体通过与环境的交互,使得其作出的动作所得到的决策得到的总的奖励达…

C++:二分习题

1. 借教室 503. 借教室 - AcWing题库 在大学期间,经常需要租借教室。 大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。 教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。  面对海…

二进制安装指定版本的MariaDBv10.11.6

一、官网下载mariadb安装包 Download MariaDB Server - MariaDB.org 找到对应的版本 下载安装包后上传到服务器这里不再赘述。 二、安装二进制包 1、解压安装包 2、查看安装包内的安装提示文档根据提示文档进行安装 # 解压安装包 tar xf mariadb-10.11.6-linux-systemd-x8…

2025-03-12 Python深度学习1——安装Anaconda与PyTorch库

文章目录 1 配置 Anaconda1.1 下载1.2 安装1.3 配置环境变量1.4 检查安装 2 安装 PyTorch 库2.1 创建 DL 环境2.2 安装/升级 CUDA2.3 配置环境变量2.4 安装 Pytorch 库方法一(不稳定)方法二(推荐) 2.5 检查安装 3 Pycharm Communi…

Redis-缓存穿透击穿雪崩

1. 穿透问题 缓存穿透问题就是查询不存在的数据。在缓存穿透中,先查缓存,缓存没有数据,就会请求到数据库上,导致数据库压力剧增。 解决方法: 给不存在的key加上空值,防止每次都会请求到数据库。布隆过滤器…

学习springboot(Bean 注册,Bean 扫描)

Bean 扫描 可以浏览下面的博客链接 :spring 学习 (注解)-CSDN博客 在学习spring 注解时,我们使用 Component ,Service,Controller等 这样的注解,将目标类信息,传递给IOC容器,为其创…

使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图

以下是使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图: graph TDA[开始移植] --> B[代码兼容性检查]B --> C[检查系统调用差异\nfork/exec -> CreateProcess]B --> D[检查文件路径格式\n/ vs \\]B --> E[检查依赖库兼容性\nPOSIX vs …

网络信息安全专业(710207)网络安全攻防实训室建设方案

一、引言 随着信息技术的飞速发展,网络空间安全已成为国家安全的重要组成部分,对网络信息安全专业人才的需求日益增长。为满足网络信息安全专业(专业代码710207)的教学需求,提升学生在网络安全攻防领域的实践能力&…

赶紧白P这款免费神器!

现在,很多视频剪辑软件都开始收费了,真正免费又好用的软件真的越来越难找了。 今天,我给大家推荐一款非常小巧的视频编辑工具,目前完全免费,功能却非常丰富。 咔咔一通剪 视频编辑工具 这款软件真的超级轻巧&#xff…

Qt 初识1.1

目录 QLineEdit QPushButton connet: Qt命名规范 Qt窗口坐标系 QLineEdit ​ ​ QPushButton ​ 给按钮的点击操作上关联一个处理函数。 connet: connet的作用是连接信号和槽,是QObject类中的一个静态函数, ​ Qt命…

Linux内核机制之epoll详解

目录 简介: 一、IO 多路复用介绍 1、select,poll,epoll 引入 2、select,poll,epoll 区别分析 3、epoll 原理 3.1 epoll 相关函数介绍 1)epoll_create 2)epoll_ctl 3)epoll_…

以 ArcGIS Pro 为笔,绘就水墨地图画卷

一、引言 水墨画,作为中国传统绘画艺术的瑰宝,以其独特的韵味和表现力,在艺术领域占据着重要地位。它通过水与墨的交融,展现出山水之间的灵动与韵味。 而将这种艺术形式与现代地理信息系统(GIS)技术相结合…

JAVA:利用 Jsoup 轻松解析和操作 HTML 的技术指南

1、简述 在现代 Java 开发中,处理 HTML 数据是一项常见需求,无论是抓取网页数据、解析 HTML 文档,还是操作 DOM 树,Jsoup 都是一个强大的工具。它是一个基于 Java 的 HTML 解析库,支持从 URL、文件或字符串中解析 HTM…

个人记录的一个插件,Unity-RuntimeMonitor

没有什么干货,仅仅是个人的记录 基于GUI做的一个工具:好处就是Monitor必须,Unity天然支持实时的Monitor;唯一不好处,就是默认字体太小了,layout居中,居右也是要自行设计的。 (下面文字是有一点点写错,但意思和功能就很牛逼了;并不是都按2 x shift,而是一个 shift 添…

云服务器安装宝塔面板部署

单机部署(前端vue项目) 服务器安装宝塔面板 连接到服务器 使用 SSH 连接到你的服务器: ssh rootip安装宝塔面板 运行以下命令来安装宝塔面板: yum install -y wget wget -O install.sh http://download.bt.cn/install/install_6.0.sh sh install.sh安…

Java数据结构第二十期:解构排序算法的艺术与科学(二)

专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、常见排序算法的实现 1.1. 直接选择排序 1.2. 堆排序 1.3. 冒泡排序 1.4. 快速排序 一、常见排序算法的实现 1.1. 直接选择排序 每⼀次从待排序的数据元素中选出最小的⼀个元素,存放在…

【MapSet】哈希表

目录 1. 搜索树 1.1 概念 1.2 操作-查找 1.3 操作-插入 1.4 操作-删除(难点) 1.5 性能分析 1.6 和java类集的关系 2. 搜索 2.1 概念及场景 2.2 模型 3. Map的使用 3.1 关于Map的说明 3.2 关于Map.Entry的说明 3.3 Map的常用方法说明 3.4 …

手写一个Tomcat

Tomcat 是一个广泛使用的开源 Java Servlet 容器,用于运行 Java Web 应用程序。虽然 Tomcat 本身功能强大且复杂,但通过手写一个简易版的 Tomcat,我们可以更好地理解其核心工作原理。本文将带你一步步实现一个简易版的 Tomcat,并深…