【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 {
    @Test
    public 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= INFO

java.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 {
    @Test
    public 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应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/708449.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅谈TARA在汽车网络安全中的关键角色

随着现代汽车技术的迅猛发展,网络安全成为汽车行业一个不可忽视的领域。为了应对日益复杂的网络威胁,ISO/SAE 21434标准和UN R155法规提供了系统化的网络安全管理框架。其中,TARA(威胁分析与风险评估)作为核心方法论&a…

UE5-不同材质上脚步声

主要是用物理材质给不同的材质加一个标签 创建材质 首先去设置里面创建几个地形材质名称,我这里创建了Grass,Rock,Wood,Water (就是名字而已) 然后创建物理材质(物理材质可以添加到现有的普通…

使用ZIP包安装MySQL及配置教程

在本教程中,我们将指导您完成使用ZIP包安装MySQL的过程,并对配置文件进行必要的修改,以及解决可能遇到的问题。本示例以MySQL 5.7.44为例,但步骤同样适用于其他版本如MySQL 8.3.0等。请根据实际需要选择适合的版本下载&#xff1a…

语法08 C++ 数据类型之间的强制转换

强制类型转换 强制类型转换,就是把一种数据类型转化为另一种指定的数据类型。 它是一种临时的转换。 强制类型转换格式 格式:(数据类型) (表达式) 即:(要被转换成的类型)(被转换的式子); 注意&#x…

怎么批量去除EXCEL表格内时间?(已解决)

作为竞价优化师,经常碰到下载表格以后发现有冗余数据,这个时候我们该怎么快速处理呢! 第一步,选择这一行数据 第二步,右击选择“单元格格式-日期” 第三步,选择日期中的2001-3-7格式,点击“确定…

持绪电商:开一家抖音网店大概多久才能做起来

在数字化浪潮的推动下,抖音不仅是年轻人喜爱的短视频平台,更成为电商的新阵地。不少创业者和品牌纷纷入驻,希望能借力抖音的流量红利实现快速成长。但开设一家抖音网店并使其蓬勃发展,并非一朝一夕之事,它需要策略、耐…

【调试笔记-20240613-Linux-在 git 多分支间合并】

调试笔记-系列文章目录 调试笔记-20240613-Linux-在 git 多分支间合并 文章目录 调试笔记-系列文章目录调试笔记-20240613-Linux-在 git 多分支间合并 前言一、调试环境操作系统:Ubuntu 22.04.4 LTS调试环境调试目标 二、调试步骤在远端 git 服务器建立多个分支在本…

Linux 系统删除乱码文件

项目场景: 通过rm -rf 删除乱码文件,删除不了 问题描述 这时直接使用命令rm -rf 是删除不了的。只能通过删除 inode方法处理。 原因分析: 在Linux上传文件或文件夹时,由于出现连接中断,出现了大量的乱码文件&#…

C++实现以太网帧的模拟封装与发送

一、目的与要求 计算机网络实验,模拟以太网帧的创建、读取和校验。 目的要求: (1)设计以太网V2的MAC帧结构的数据结构。 (2)能够从文件中读取来自网络层的数据,并显示到屏幕上。 (3)用模2运算方法由CRC-32函数得到FCS。 (4)加上帧首部和…

【C++游戏程序】easyX图形库还原游戏《贪吃蛇大作战》(一)

一.游戏逻辑概述 游戏完成图如图下所示: 根据游戏设定,需要实现的总体框架如下: 场景中有玩家可以操纵的初始角色-贪吃蛇场景中有AI自动操作的敌人-敌对贪吃蛇场景中的彩色圆点可以被敌人或者玩家吃掉,并且增加分数玩家触碰到敌人…

基于ResNet-18的简单分类(新手,而且网络效果不咋滴,就是学个流程)

引言 先看问题: 我手边有一数据集,然后我想分分类!~~ 咳咳,最近刚做了一个:训练集有1143张,分为5类,里面图片是打乱的。测试集有248张,想把它分分类看看咋样。 再看一下效果: …

万字长文爆肝Spring(一)

Spring_day01 今日目标 掌握Spring相关概念完成IOC/DI的入门案例编写掌握IOC的相关配置与使用掌握DI的相关配置与使用 1,课程介绍 对于一门新技术,我们需要从为什么要学、学什么以及怎么学这三个方向入手来学习。那对于Spring来说: 1.1 为什么要学? …

Python 使用 Tkinter库 设置 tkinter ttk 框架的背景颜色

Tkinter 设置 tkinter ttk 框架的背景颜色 在本文中,我们将介绍如何使用 Tkinter 在 tkinter ttk 框架中设置背景颜色。Tkinter 是 Python 中常用的 GUI 工具包,ttk 则是 Tkinter 中的一个模块,提供了一套更加现代化的控件。 Tkinter 简介 …

C4D如何预览动画?C4D动画云渲染助力

C4D是一款功能丰富的3D设计软件,以其快速的预览渲染和多样的渲染插件而闻名,其卓越的渲染效果赢得了CG行业专业人士的广泛赞誉。尽管C4D的渲染功能十分强大,但对于初学者而言,其复杂的渲染设置可能会带来一些挑战。本文一起来看看…

Linux——ansible的应用

要让ansible管理业务里的主机 1.得先知道,有哪些主机 用IP地址,用主机名 2.知道了有哪些主机以后,精细、细分管理 主机要用某些办法,分组管理 在ansible里,要用一个东西:清单->inventory inventory …

Tensorflow入门实战 T04-猴痘识别

本篇文章主要:tensorflow 运行环境:本地cpu 运行epoch:50 1、tensorflow官网 tensorflow的官网教程。初学者的 TensorFlow 2.0 教程 | TensorFlow Core 官网上有图像分类的相关详细描述还有代码示例。 2、完整代码展示 from tensorflo…

探索Napier:Kotlin Multiplatform的日志记录库

探索Napier:Kotlin Multiplatform的日志记录库 在现代软件开发中,日志记录是不可或缺的部分,它帮助开发者追踪应用的行为和调试问题。对于Kotlin Multiplatform项目而言,能够在多个平台上统一日志记录的方法显得尤为重要。Napier…

远程开发端口转发

应用推荐场景: 1.服务器跑后台,本地出前端应用。 比如Stable Diffusion的大模型打标应用。 2.Docker容器服务器。 对于本地服务想要转出去,跑出来前端。该项能克服虚拟机的端口与ip访问问题。 正文: 涉及的软件: …

Petalinux由于网络原因产生的编译错误(3)-qemu-xilinx-system-native 失败

1 获取qemu-xilinx-system-native 失败 编译时遇到qemu-xilinx-system-native 包获取失败,如下图所示: 解决这种错误方法如下: 进入Petalinux 工程,编辑工程下的 project-spec/meta-user/conf/petalinuxbsp.conf 文件&#xff0…

苹果AI来了,ios18史诗级发布

今天凌晨1点,苹果举行了WWDC开发者大会,正式发布了 全新iOS 18、iPadOS 18、watchOS 11、tvOS 18、macOS 等以及Apple Intelligence的个人化智能系统 苏音给大家汇总下,ios18的更新内容以及苹果的AI。 本次更新,官方带来的title…