当前位置: 首页 > news >正文

【Java】解决Java报错:FileNotFoundException

在这里插入图片描述

文章目录

      • 引言
      • 1. 错误详解
      • 2. 常见的出错场景
        • 2.1 文件路径错误
        • 2.2 文件名拼写错误
        • 2.3 文件权限问题
        • 2.4 文件路径未正确拼接
      • 3. 解决方案
        • 3.1 检查文件路径
        • 3.2 使用相对路径和类路径
        • 3.3 检查文件权限
        • 3.4 使用文件选择器
      • 4. 预防措施
        • 4.1 使用配置文件
        • 4.2 使用日志记录
        • 4.3 使用单元测试
        • 4.4 使用相对路径和类路径
      • 5. 示例项目
        • 5.1 项目结构
        • 5.2 Main.java
        • 5.3 ConfigReader.java
        • 5.4 LoggerConfig.java
        • 5.5 config.properties
        • 5.6 logging.properties
      • 6. 单元测试
        • 6.1 MainTest.java
      • 结语

引言

在Java编程中,FileNotFoundException 是一种常见的受检异常,通常发生在试图打开一个不存在的文件或文件路径错误时。这类错误提示为:“FileNotFoundException: [file path] (No such file or directory)”,意味着程序无法找到指定的文件。本文将详细探讨FileNotFoundException的成因、解决方案以及预防措施,帮助开发者理解和避免此类问题,从而提高代码的健壮性和可靠性。

1. 错误详解

FileNotFoundException 是一种由 Java 运行时环境抛出的异常,表示程序试图访问一个不存在的文件或目录。该异常是 IOException 的子类,属于受检异常,必须在代码中显式处理。

2. 常见的出错场景

2.1 文件路径错误

最常见的情况是文件路径错误,导致JVM在运行时无法找到所需的文件。

import java.io.*;public class Main {public static void main(String[] args) {try {FileReader reader = new FileReader("nonexistentfile.txt");  // 文件路径错误,将抛出FileNotFoundException} catch (FileNotFoundException e) {System.out.println("文件未找到: " + e.getMessage());}}
}
2.2 文件名拼写错误

文件名拼写错误也会导致FileNotFoundException

import java.io.*;public class Main {public static void main(String[] args) {try {FileReader reader = new FileReader("example.tx");  // 文件名拼写错误,将抛出FileNotFoundException} catch (FileNotFoundException e) {System.out.println("文件未找到: " + e.getMessage());}}
}
2.3 文件权限问题

文件权限不足,导致程序无法访问文件。

import java.io.*;public class Main {public static void main(String[] args) {try {FileReader reader = new FileReader("/root/secretfile.txt");  // 文件权限不足,将抛出FileNotFoundException} catch (FileNotFoundException e) {System.out.println("文件未找到或权限不足: " + e.getMessage());}}
}
2.4 文件路径未正确拼接

在构建文件路径时未正确拼接,导致路径错误。

import java.io.*;public class Main {public static void main(String[] args) {String directory = "/home/user/";String filename = "example.txt";String filepath = directory + filename;  // 拼接文件路径try {FileReader reader = new FileReader(filepath);} catch (FileNotFoundException e) {System.out.println("文件未找到: " + e.getMessage());}}
}

3. 解决方案

解决FileNotFoundException的关键在于确保文件路径正确,文件存在,并且程序具有访问权限。

3.1 检查文件路径

在访问文件之前,检查文件路径是否正确,并确保文件存在。

import java.io.*;public class Main {public static void main(String[] args) {String filepath = "example.txt";File file = new File(filepath);if (file.exists()) {try {FileReader reader = new FileReader(filepath);BufferedReader br = new BufferedReader(reader);String line;while ((line = br.readLine()) != null) {System.out.println(line);}br.close();} catch (IOException e) {System.out.println("读取文件时发生错误: " + e.getMessage());}} else {System.out.println("文件未找到: " + filepath);}}
}
3.2 使用相对路径和类路径

确保使用正确的相对路径或类路径访问文件,避免硬编码绝对路径。

import java.io.*;
import java.net.URL;public class Main {public static void main(String[] args) {ClassLoader classLoader = Main.class.getClassLoader();URL resource = classLoader.getResource("example.txt");if (resource != null) {try {FileReader reader = new FileReader(resource.getFile());BufferedReader br = new BufferedReader(reader);String line;while ((line = br.readLine()) != null) {System.out.println(line);}br.close();} catch (IOException e) {System.out.println("读取文件时发生错误: " + e.getMessage());}} else {System.out.println("文件未找到");}}
}
3.3 检查文件权限

确保程序具有访问文件的权限,特别是在需要读取或写入系统文件时。

import java.io.*;public class Main {public static void main(String[] args) {String filepath = "/root/secretfile.txt";File file = new File(filepath);if (file.exists() && file.canRead()) {try {FileReader reader = new FileReader(filepath);BufferedReader br = new BufferedReader(reader);String line;while ((line = br.readLine()) != null) {System.out.println(line);}br.close();} catch (IOException e) {System.out.println("读取文件时发生错误: " + e.getMessage());}} else {System.out.println("文件未找到或无访问权限: " + filepath);}}
}
3.4 使用文件选择器

使用文件选择器(如JFileChooser)选择文件,避免手动输入路径错误。

import javax.swing.*;
import java.io.*;public class Main {public static void main(String[] args) {JFileChooser fileChooser = new JFileChooser();int result = fileChooser.showOpenDialog(null);if (result == JFileChooser.APPROVE_OPTION) {File file = fileChooser.getSelectedFile();try {FileReader reader = new FileReader(file);BufferedReader br = new BufferedReader(reader);String line;while ((line = br.readLine()) != null) {System.out.println(line);}br.close();} catch (IOException e) {System.out.println("读取文件时发生错误: " + e.getMessage());}} else {System.out.println("未选择文件");}}
}

4. 预防措施

4.1 使用配置文件

使用配置文件(如properties文件)存储文件路径,避免硬编码路径。

import java.io.*;
import java.util.Properties;public class Main {public static void main(String[] args) {try {Properties properties = new Properties();properties.load(new FileInputStream("config.properties"));String filepath = properties.getProperty("filepath");FileReader reader = new FileReader(filepath);BufferedReader br = new BufferedReader(reader);String line;while ((line = br.readLine()) != null) {System.out.println(line);}br.close();} catch (IOException e) {System.out.println("读取文件时发生错误: " + e.getMessage());}}
}
4.2 使用日志记录

在程序中使用日志记录文件访问的尝试和错误,帮助调试和定位问题。

import java.io.*;
import java.util.logging.*;public class Main {private static final Logger logger = Logger.getLogger(Main.class.getName());public static void main(String[] args) {String filepath = "example.txt";File file = new File(filepath);if (file.exists()) {try {FileReader reader = new FileReader(filepath);BufferedReader br = new BufferedReader(reader);String line;while ((line = br.readLine()) != null) {System.out.println(line);}br.close();} catch (IOException e) {logger.log(Level.SEVERE, "读取文件时发生错误", e);}} else {logger.log(Level.WARNING, "文件未找到: " + filepath);}}
}
4.3 使用单元测试

编写单元测试来验证文件访问的正确性,确保代码在各种边界条件下都能正确运行。

import org.junit.Test;
import java.io.*;
import static org.junit.Assert.*;public class MainTest {@Testpublic void testFileRead() {String filepath = "example.txt";File file = new File(filepath);if (file.exists()) {try {FileReader reader = new FileReader(filepath);BufferedReader br = new BufferedReader(reader);String line = br.readLine();assertNotNull(line);  // 验证文件内容不为空br.close();} catch (IOException e) {fail("读取文件时发生错误: " + e.getMessage());}} else {fail("文件未找到: " + filepath);}}
}
4.4 使用相对路径和类路径

使用相对路径和类路径访问文件,确保文件能够随程序一起部署和

访问。

import java.io.*;
import java.net.URL;public class Main {public static void main(String[] args) {ClassLoader classLoader = Main.class.getClassLoader();URL resource = classLoader.getResource("example.txt");if (resource != null) {try {FileReader reader = new FileReader(resource.getFile());BufferedReader br = new BufferedReader(reader);String line;while ((line = br.readLine()) != null) {System.out.println(line);}br.close();} catch (IOException e) {System.out.println("读取文件时发生错误: " + e.getMessage());}} else {System.out.println("文件未找到");}}
}

5. 示例项目

以下是一个示例项目,展示如何正确处理文件路径和访问,避免FileNotFoundException

5.1 项目结构
myproject
├── src
│   └── main
│       └── java
│           ├── Main.java
│           ├── ConfigReader.java
│           └── LoggerConfig.java
├── resources
│   └── example.txt
│   └── config.properties
└── pom.xml
5.2 Main.java
import java.io.*;
import java.util.logging.*;public class Main {private static final Logger logger = Logger.getLogger(Main.class.getName());public static void main(String[] args) {LoggerConfig.configureLogger(logger);ConfigReader configReader = new ConfigReader();String filepath = configReader.getFilePath("filepath");if (filepath != null) {try {FileReader reader = new FileReader(filepath);BufferedReader br = new BufferedReader(reader);String line;while ((line = br.readLine()) != null) {System.out.println(line);}br.close();} catch (IOException e) {logger.log(Level.SEVERE, "读取文件时发生错误", e);}} else {logger.log(Level.WARNING, "文件路径未在配置文件中找到");}}
}
5.3 ConfigReader.java
import java.io.*;
import java.util.Properties;public class ConfigReader {public String getFilePath(String key) {try {Properties properties = new Properties();properties.load(getClass().getClassLoader().getResourceAsStream("config.properties"));return properties.getProperty(key);} catch (IOException e) {e.printStackTrace();return null;}}
}
5.4 LoggerConfig.java
import java.util.logging.*;public class LoggerConfig {public static void configureLogger(Logger logger) {try {LogManager.getLogManager().readConfiguration(LoggerConfig.class.getClassLoader().getResourceAsStream("logging.properties"));} catch (IOException e) {e.printStackTrace();}}
}
5.5 config.properties
filepath=example.txt
5.6 logging.properties
handlers= java.util.logging.ConsoleHandler
.level= INFOjava.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

6. 单元测试

编写单元测试来验证文件访问的正确性,确保代码在各种边界条件下都能正确运行。

6.1 MainTest.java
import org.junit.Test;
import java.io.*;
import static org.junit.Assert.*;public class MainTest {@Testpublic void testFileRead() {ConfigReader configReader = new ConfigReader();String filepath = configReader.getFilePath("filepath");assertNotNull("文件路径不应为空", filepath);File file = new File(filepath);if (file.exists()) {try {FileReader reader = new FileReader(filepath);BufferedReader br = new BufferedReader(reader);String line = br.readLine();assertNotNull(line);  // 验证文件内容不为空br.close();} catch (IOException e) {fail("读取文件时发生错误: " + e.getMessage());}} else {fail("文件未找到: " + filepath);}}
}

结语

理解并有效处理FileNotFoundException对于编写健壮的Java程序至关重要。通过本文提供的解决方案和预防措施,开发者可以有效避免和解决这类错误,提高代码质量和可靠性。希望本文能帮助你更好地理解和处理文件访问问题,从而编写出更加可靠的Java应用程序。

相关文章:

【Java】解决Java报错:FileNotFoundException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 文件路径错误2.2 文件名拼写错误2.3 文件权限问题2.4 文件路径未正确拼接 3. 解决方案3.1 检查文件路径3.2 使用相对路径和类路径3.3 检查文件权限3.4 使用文件选择器 4. 预防措施4.1 使用配置文件4.2 使用日志记录4.3 使用单元测…...

Seate分布式锁

XA模式 在第一阶段资源协调者(TC)会向资源管理者(RM)发出一个准备的请求,RM开始处理自身的业务,处理完成后不提交事务,而是向TC响应一个执行结果,表明自己成功还是失败,如…...

金融科技助力绿色金融:可持续发展新动力

随着全球气候变化和环境问题的日益严重,绿色金融作为推动环境保护和经济可持续发展的重要手段,已经受到越来越多的关注。而金融科技,作为科技与金融深度融合的产物,正以其独特的优势为绿色金融的发展注入新动力。本文将探讨金融科…...

灾备建设中虚拟机细粒度恢复的含义及技术使用

灾备建设中为了考虑虚拟机恢复的效率与实际的用途,在恢复上出了普通的恢复虚拟机,也有其余的恢复功能,比如瞬时恢复,细粒度恢复等。这里谈的就是细粒度恢复。 首先细粒度恢复是什么,这个恢复可以恢复单个备份下来的文…...

十种排序方法

目录 1.冒泡排序(Bubble Sort)代码实现 2.选择排序(Selection Sort)代码实现 3.插入排序(Insertion Sort) 4.希尔排序(Shell Sort)代码实现 5.快速排序(Quick Sort&…...

docker-compose启动oracle11、并使用navicat进行连接

一、docker-compose.yml version: 3.9 services:oracle:image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11grestart: alwaysprivileged: truecontainer_name: oracle11gvolumes:- ./data:/u01/app/oracleports:- 1521:1521network_mode: "host"logging:d…...

使用ffmpeg进行音频处理

音频处理是数字媒体制作中不可或缺的一部分,而ffmpeg作为一款强大的多媒体处理工具,为我们提供了丰富的音频处理功能。 一、查看音频信息 在处理音频之前,了解音频的基本信息是非常重要的。FFmpeg的ffprobe工具可以帮助我们查看音频的详细信息,如采样率、位深等。 示例命…...

重装系统,以及设置 深度 学习环境

因为联想y7000在ubantu系统上连不到wifi,所以打算弄双系统 第一步:下载win10镜像,之后在系统用gparted新建个分区,格式化成ntfs,用来装win10系统 第二步,制作win10启动盘,这个需要先把u盘用disks格式化&a…...

深入理解渲染引擎:打造逼真图像的关键

在数字世界中,图像渲染是创造逼真视觉效果的核心技术。渲染引擎,作为这一过程中的关键组件,负责将二维或三维的模型、纹理、光照等数据转化为人们肉眼可见的二维图像。本文将深入探讨渲染引擎的工作原理及其在打造逼真图像中所起的关键作用。…...

【LeetCode最详尽解答】128_最长连续序列 Longest-Consecutive-Sequence

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家! 链接: 128_最长连续序列 直觉 输入: nums [100, 4, 200, 1, 3, 2]输出: 4解释: 最长的连续元素序列是…...

盒马鲜生礼品卡如何使用?

盒马鲜生的礼品卡除了在门店用以外,还有什么用处啊 毕竟家附近的盒马距离都太远了,好多卡最后都闲置下来了,而且以前都不知道盒马卡还会过期,浪费了好多 还好最近发现了 盒马鲜生礼品卡现在也能在收卡云上兑现了,而且…...

有哪些常用ORM框架

ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,它允许开发者使用面向对象的编程语言来操作关系型数据库。ORM的主要目的是将数据库中的数据表映射到编程语言中的对象,从而使得开发者可以使用对象的方式来…...

nodejs 中 axios 设置 burp 抓取 http 与 https

在使用 axios 库的时候,希望用 burp 抓包查看发包内容。但关于 axios 设置代理问题,网上提到的一些方法不是好用,摸索了一段时间后总结出设置 burp 代理抓包的方法。 nodejs 中 axios 设置 burp 抓包 根据请求的站点,分为 http …...

数据通信与网络(二)

如何构建网络协议 这些协议采用分层的结构,每层协议实现特定功能,同时也需要依靠低层协议所提供的服务。 网络协议可以理解为三部分组成: 1、语法:通信时双方交换数据和控制信息的格式,是对通信时采用的数据结构形式…...

DTU为何应用如此广泛?

1.DTU是什么 DTU(数据传输单元)是一种无线终端设备,它的核心功能是将串口数据转换为IP数据或将IP数据转换为串口数据,并通过无线通信网络进行传送。DTU通常内置GPRS模块,能够实现远程数据的实时传输,广泛应用于工业自动化、远程监…...

基于软件在环的飞控机建模仿真

安全关键系统(Safety-Critical System,SCS)是指由于某些行为或组合行为能够引发整体系统失效,继而导致财物损失、人员受伤等严重影响的系统,诸多安全关键领域如航空航天、核电系统、医疗设备、交通运输等领域的系统都属…...

github ssh key的SHA256是什么

github ssh key的SHA256是什么 怎么知道github上自己的公钥指纹和本地的公钥是否一致? 计算方法如下: cat .ssh/id_rsa.pub |awk { print $2 } | # Only the actual key data without prefix or commentsbase64 -d | # decode as base64s…...

HyperBDR新版本上线,自动化容灾兼容再升级!

本次HyperBDR v5.5.0版本新增完成HCS(Huawei Cloud Stack)8.3.x和HCSO(Huawei Cloud Stack Online)自动化对接,另外还突破性完成了Oracle云(块存储模式)的自动化对接。 HyperBDR,云原生业务级别容灾工具。支…...

python学习—合并多个Excel工作簿表格文件

系列文章目录 python学习—合并TXT文本文件 python学习—统计嵌套文件夹内的文件数量并建立索引表格 python学习—查找指定目录下的指定类型文件 python学习—年会不能停,游戏抽签抽奖 python学习—循环语句-控制流 文章目录 系列文章目录功能说明1 准备工作&#…...

如何把路由器设备的LAN口地址为三大私网地址

要将路由器的LAN口地址配置为三大私有IP地址范围之一(10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16),我们需要访问路由器的管理界面并进行相应的设置。 下面是步骤: 连接到路由器: 连接到路由器的管理界面&#xf…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

PHP和Node.js哪个更爽?

先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...