Java学习——day20

news2025/3/13 21:34:39

文章目录

  • 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 会自动关闭 BufferedReader
    try (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-resources
    try (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.coloradmin.cn/o/2314501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于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 …

MySQL 优化方案

一、MySQL 查询过程 MySQL 查询过程是指从客户端发送 SQL 语句到 MySQL 服务器,再到服务器返回结果集的整个过程。这个过程涉及多个组件的协作,包括连接管理、查询解析、优化、执行和结果返回等。 1.1 查询过程的关键组件 连接管理器:管理…

智能对话小程序功能优化day1-登录鉴权

目录 1.数据库表构建。 2.完善登录相关的实例对象。 3.登录相关功能实现。 4.小程序效果。 最近尝试下trae加入claude3.7后的读图生成代码功能,可以看到简单的页面一次性生成确实准确率高了不少,想起来之前笔记中开发的智能问答小程序功能还是有些简…

MinIO的预签名直传机制

我们传统使用MinIo做OSS对象存储的应用方式往往都是在后端配置与MinIO的连接和文件上传下载的相关接口,然后我们在前端调用这些接口完成文件的上传下载机制,但是,当并发量过大,频繁访问会对后端的并发往往会对服务器造成极大的压力…

Qt开源控件库(qt-material-widgets)的编译及使用

项目简介 qt-material-widgets是一个基于 Qt 小部件的 Material Design 规范实现。 项目地址 项目地址:qt-material-widgets 本地构建环境 Win11 家庭中文版 VS2019 Qt5.15.2 (MSVC2019) 本地构建流程 克隆后的目录结构如图: 直接使用Qt Crea…

用python批量生成文件夹

问题描述 当批量生成文件夹时,手动右键创建文件夹是一个繁琐的过程,尤其是文件夹的命名过程。假设从3月10日到3月19日,每天要为某个日常工作创建一个名为2025031x的文件夹,手动创建文件夹并命名费时费力。 百度给出了以下四种方法…

【MySQL】基本操作 —— DDL

目录 DDLDDL 常用操作对数据库的常用操作查看所有数据库创建数据库切换、显示当前数据库删除数据库修改数据库编码 对表的常用操作创建表数据类型数值类型日期和时间类型字符串类型 查看当前数据库所有表查看指定表的创建语句查看指定表结构删除表 对表结构的常用操作给表添加字…

游戏引擎学习第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…

【JavaWeb】快速入门——HTMLCSS

文章目录 一、 HTML简介1、HTML概念2、HTML文件结构3、可视化网页结构 二、 HTML标签语法1、标题标签2、段落标签3、超链接4、换行5、无序列表6、路径7、图片8、块1 盒子模型2 布局标签 三、 使用HTML表格展示数据1、定义表格2、合并单元格横向合并纵向合并 四、 使用HTML表单收…

若依框架-给sys_user表添加新字段并获取当前登录用户的该字段值

目录 添加字段 修改SysUser类 修改SysUserMapper.xml 修改user.js 前端获取字段值 添加字段 若依框架的sys_user表是没有age字段的,但由于业务需求,我需要新添加一个age字段: 修改SysUser类 添加age字段后,要在SysUser类 …

前端监测窗口尺寸和元素尺寸变化的方法

前端监测窗口尺寸变化和元素尺寸变化的方法 window.resize 简介 window.resize事件是浏览器提供的一种事件,用于监听窗口大小的改变。这意味着当用户调整浏览器窗口大小时,相关的JavaScript代码将被触发执行。这为开发者提供了一种机制,可…

ubuntu 部署deepseek

更新 apt update 升级 apt upgrade 格式化硬盘 mkfs.ext4 /dev/sdb 安装nginx 查看端口 一、安装Ollama Ollama是一个开源的大型语言模型(LLM)推理服务器,为用户提供了灵活、安全和高性能的语言模型推理解决方案。 ollama/docs/linux.m…

MySQL库和表的操作详解:从创建库到表的管理全面指南

目录 一、MySQL库的操作详解 〇、登录MySQL 一、数据库的创建与字符集设置 1. 创建数据库的语法 2. 创建数据库示例 查看创建出来的文件: bash下查看MySQL创建的文件 二、字符集与校验规则 1. 查看系统默认设置 2. 查看支持的字符集与校验规则 3. 校验规则对查询的影响…

PyTorch 系列教程:使用CNN实现图像分类

图像分类是计算机视觉领域的一项基本任务,也是深度学习技术的一个常见应用。近年来,卷积神经网络(cnn)和PyTorch库的结合由于其易用性和鲁棒性已经成为执行图像分类的流行选择。 理解卷积神经网络(cnn) 卷…

Java 大视界 -- Java 大数据中的数据可视化大屏设计与开发实战(127)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

「Unity3D」UGUI将元素固定在,距离屏幕边缘的某个比例,以及保持元素自身比例

在不同分辨率的屏幕下,UI元素按照自身像素大小,会发生位置与比例的变化,本文仅利用锚点(Anchors)使用,来实现UI元素,固定在某个比例距离的屏幕边缘。 首先,将元素的锚点设置为中心&…