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 异常
- 使用场景
- 在文件读取(如
FileReader、BufferedReader)时捕获IOException - 在文件写入(如
FileWriter、BufferedWriter)时捕获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. 实践任务
改进前一天的文件管理工具:
- 处理异常,如
IOException和FileNotFoundException - 使用
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-catch、try-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
相关文章:
Java学习——day20
文章目录 1. 异常处理与优化1.1 在文件操作中使用 try-catch1.2 try-with-resources 语法1.3 使用 finally 块关闭资源1.4 代码健壮性与优化 2. 实践任务2.1 改进思路2.2 示例改进要点2.3 检查点 3. 总结3.1 改进后的完整代码: 4. 今日生词 今日学习目标:…...
基于Python+SQLite实现校园信息化统计平台
一、项目基本情况 概述 本项目以清华大学为预期用户,作为校内信息化统计平台进行服务,建立网页端和移动端校内信息化统计平台,基于Project_1的需求实现。 本项目能够满足校内学生团体的几类统计需求,如活动报名、实验室招募、多…...
[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现
标题:[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现 水墨不写bug 文章目录 一、生产者消费者模型特点:二、实现2.1详细解释1. 成员变量2. 构造函数3. Isfull 和 Isempty4. Push 函数5. Pop 函数6. 析构函数7. GetSize 函数 三、总结与多线…...
vue组件库el-menu导航菜单设置index,地址不会变更的问题
请先确认 1.路由已配置好 route-index.js如下, 2.view-ProHome.vue中已预留路由展示位 3.导航菜单复制组件库,并做修改 其中index与路由配置的地址一致 运行后发现点击菜单,url地址还是不变,查看组件库 Element - The worlds …...
JavaScript通过文件地址获取文件名称
在 JavaScript 中,可以通过文件链接地址提取文件名称。文件名称通常是链接中最后一个 / 之后的部分,可能还包含查询参数或哈希片段。以下是几种常见的提取文件名称的方法: 方法 1:使用 URL 对象和 pathname URL 对象可以解析链接…...
MySQL 优化方案
一、MySQL 查询过程 MySQL 查询过程是指从客户端发送 SQL 语句到 MySQL 服务器,再到服务器返回结果集的整个过程。这个过程涉及多个组件的协作,包括连接管理、查询解析、优化、执行和结果返回等。 1.1 查询过程的关键组件 连接管理器:管理…...
智能对话小程序功能优化day1-登录鉴权
目录 1.数据库表构建。 2.完善登录相关的实例对象。 3.登录相关功能实现。 4.小程序效果。 最近尝试下trae加入claude3.7后的读图生成代码功能,可以看到简单的页面一次性生成确实准确率高了不少,想起来之前笔记中开发的智能问答小程序功能还是有些简…...
【架构艺术】Go语言微服务monorepo的代码架构设计
近期因为项目架构升级原因,笔者着手调研一些go项目monorepo的代码架构设计,目标是长期把既有微服务项目重要的部分都转移到monorepo上面,让代码更容易维护,协作开发更加方便。虽然经验不多,但既然有了初步的调研&#…...
MinIO的预签名直传机制
我们传统使用MinIo做OSS对象存储的应用方式往往都是在后端配置与MinIO的连接和文件上传下载的相关接口,然后我们在前端调用这些接口完成文件的上传下载机制,但是,当并发量过大,频繁访问会对后端的并发往往会对服务器造成极大的压力…...
谈谈List,Set,Map的区别
List、Set 和 Map 是 Java 集合框架(Java Collections Framework)中的三种主要接口,它们各自有不同的特点和用途。以下是它们的区别和使用场景的详细解释: 1. List(列表) 1.1 特点 有序集合:Li…...
投资晚报 3.12
一、 晚间要闻 1、CME美联储观察:美联储3月降息25个基点的概率为3% 3 月 12 日,据 CME「美联储观察」数据,美联储 3 月降息 25 个基点的概率为 3%,维持不变的概率为 97%。 2、美国劳工统计局将于今晚20:30公布2月CPI数据 3 月…...
蓝桥 2109统计子矩阵
问题描述 给定一个NM 的矩阵 A, 请你统计有多少个子矩阵 (最小 11, 最大 NM) 满足子矩阵中所有数的和不超过给定的整数 K ? 输入格式 第一行包含三个整数 N,M 和 K. 之后 NN 行每行包含 M 个整数, 代表矩阵 A. 输出格式 一个整数代表答案。 样例输入 3 4 10 1 2 3 4 5…...
Qt开源控件库(qt-material-widgets)的编译及使用
项目简介 qt-material-widgets是一个基于 Qt 小部件的 Material Design 规范实现。 项目地址 项目地址:qt-material-widgets 本地构建环境 Win11 家庭中文版 VS2019 Qt5.15.2 (MSVC2019) 本地构建流程 克隆后的目录结构如图: 直接使用Qt Crea…...
vue的 props 与 $emit 以及 provide 与 inject 的 组件之间的传值对比
好的,下面是 props 与 $emit 以及 provide 与 inject 的对比: 1. props 与 $emit props:父组件通过 props 向子组件传递数据,子组件接收后不可修改。子组件只能读取 props 传递给它的数据。如果需要修改或更新父组件的状态&#…...
用python批量生成文件夹
问题描述 当批量生成文件夹时,手动右键创建文件夹是一个繁琐的过程,尤其是文件夹的命名过程。假设从3月10日到3月19日,每天要为某个日常工作创建一个名为2025031x的文件夹,手动创建文件夹并命名费时费力。 百度给出了以下四种方法…...
Json 转义符号处理(Mongo changeStream op log)
使用mongo-kafka组件订阅mongo的changeStream得到 一个带有很多转义符号的json字符串 "{\"_id\": {\"_data\": \"8267D0F733000001502B022C0100296E5A1004366730C56F7E41A790BDA4CF23259A4F46645F6964006467B91713A024A00E32CDF6800004\"},…...
懒加载(Lazy Loading):原理、实现与优化策略
懒加载(Lazy Loading) 是一种优化网页性能的技术,主要用于延迟加载非关键资源(如图片、视频、脚本等),直到它们真正需要被使用时才加载。懒加载可以显著减少页面初始加载时间,降低带宽消耗&…...
dns劫持是什么?常见的劫持类型有哪些?如何预防?
DNS劫持的定义 DNS劫持(Domain Name System Hijacking)是一种网络攻击手段,攻击者通过篡改域名解析的过程,将用户对某个域名的访问请求重定向到错误或恶意的IP地址。这种攻击可能导致用户访问到钓鱼网站、恶意广告页面࿰…...
蓝桥杯省赛真题C++B组2024-握手问题
一、题目 【问题描述】 小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手(且仅有一次)。但有 7 个人,这 7 人彼此之间没有进行握手(但这…...
【MySQL】基本操作 —— DDL
目录 DDLDDL 常用操作对数据库的常用操作查看所有数据库创建数据库切换、显示当前数据库删除数据库修改数据库编码 对表的常用操作创建表数据类型数值类型日期和时间类型字符串类型 查看当前数据库所有表查看指定表的创建语句查看指定表结构删除表 对表结构的常用操作给表添加字…...
XML语法
一、XML简介 (一)定义 XML(eXtensible Markup Language,可扩展标记语言)是一种简单的文本格式,用于标记电子文件使其具有结构性的标记语言。它与HTML(HyperText Markup Language,超…...
游戏引擎学习第152天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾昨天的内容 这个节目展示了我们如何从零开始制作一款完整的游戏。我们不使用任何游戏引擎或库,而是从头开始创建一款游戏,整个开发过程都会呈现给大家。你将能够看到每一行代码的编写,了解…...
考研数学非数竞赛复习之Stolz定理求解数列极限
在非数类大学生数学竞赛中,Stolz定理作为一种强大的工具,经常被用来解决和式数列极限的问题,也被誉为离散版的’洛必达’方法,它提供了一种简洁而有效的方法,使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…...
故障诊断——neo4j入门
文章目录 neo4jQuickStartDemo neo4j QuickStart 详情可见博客:https://www.cnblogs.com/nhdlb/p/18703804,使用docker拉取最近的一个版本进行创建 docker run -it -d -p 7474:7474 -p 7687:7687 \ -v /disk5/neo4j_docker/data:/data \ -v /disk5/ne…...
【CXX】6.2 str — rust::Str
Rust::Str 公共 API // rust/cxx.hclass Str final { public:Str() noexcept;Str(const Str &) noexcept;Str(const String &) noexcept;// 如果输入不是 UTF-8,抛出 std::invalid_argument 异常。Str(const std::string &);Str(const char *);Str(con…...
【JavaWeb】快速入门——HTMLCSS
文章目录 一、 HTML简介1、HTML概念2、HTML文件结构3、可视化网页结构 二、 HTML标签语法1、标题标签2、段落标签3、超链接4、换行5、无序列表6、路径7、图片8、块1 盒子模型2 布局标签 三、 使用HTML表格展示数据1、定义表格2、合并单元格横向合并纵向合并 四、 使用HTML表单收…...
unordered_set 的常用函数
在 C 的标准库中,std::unordered_set 是基于哈希表实现的哈希集合。下面介绍这种语言里哈希集合的常用函数。 C std::unordered_set 1. 元素操作 insert 功能:向哈希集合中插入元素。如果元素已经存在,则不会重复插入。示例代码:…...
若依框架-给sys_user表添加新字段并获取当前登录用户的该字段值
目录 添加字段 修改SysUser类 修改SysUserMapper.xml 修改user.js 前端获取字段值 添加字段 若依框架的sys_user表是没有age字段的,但由于业务需求,我需要新添加一个age字段: 修改SysUser类 添加age字段后,要在SysUser类 …...
前端监测窗口尺寸和元素尺寸变化的方法
前端监测窗口尺寸变化和元素尺寸变化的方法 window.resize 简介 window.resize事件是浏览器提供的一种事件,用于监听窗口大小的改变。这意味着当用户调整浏览器窗口大小时,相关的JavaScript代码将被触发执行。这为开发者提供了一种机制,可…...
angular中下载接口返回文件
目录 一、URL.createObjectURL() 一、URL.createObjectURL() createObjectURL属于js的原生方法,位于window.URL上,用于将Blob或者File文件转换为可以临时的URL地址进行显示 **注意**:Angular 的 HttpClient 默认将响应解析为 JSON 对象16。…...
