【问题标题】:How to fix FileReader error where getCause points to null when reading csv file?如何修复读取csv文件时getCause指向null的FileReader错误?
【发布时间】:2019-04-29 16:01:32
【问题描述】:

我正在测试 csv 文件读取,但我不断收到相同的错误。显示的错误是“无法读取请求的文件。原因:空”。这是我的代码的简化版本,仍然产生相同的错误。

public class PersonReader {
    public static List<Person> readPersons(String path) throws IOException{
        ArrayList<Person> persons = new ArrayList<>();
        BufferedReader reader = null;

        try {
            reader = new BufferedReader(new FileReader(path));
            String line = null; // read first line

            while((line = reader.readLine()) != null) {
                persons.add(new Person(line));
            }
        } finally {
            if(reader != null) {
                reader.close();
            }
        }

        return persons;
}

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }
}

public class Main{
    public static void main(String[] args) {
        List<Person> persons = null;

        try {
            persons = PersonReader.readPersons("sample/Data.csv");
        } catch (IOException e) {
            System.err.println("Could not read the requested file. Cause: " + e.getCause());
        }

        if(persons == null) { // some error has occurred
            System.exit(1);
        }

        System.out.println(persons);
    }
}

我尝试过的 PersonReader 的替代版本会产生相同的错误

public class PersonReader {
    public static List<Person> readPersons(String path) throws IOException{
        ArrayList<Person> persons = new ArrayList<>();
        BufferedReader reader = null;

        try {
            reader = Files.newBufferedReader(Paths.get(path));
            String line = null;

            while((line=reader.readLine()) != null) {
                persons.add(new Person(line));
            }
        } finally {
            if(reader != null) {
                reader.close();
            }
        }

        return persons;
    }

StackTrace 产生

java.io.FileNotFoundException:   (The system cannot find the path specified)
    at java.base/java.io.FileInputStream.open0(Native Method)
    at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
    at java.base/java.io.FileReader.<init>(FileReader.java:60)
    at sample.PersonReader.readPersons(PersonReader.java:17)
    at sample.Main.main(Main.java:14)

【问题讨论】:

  • 在您的 catch 子句下添加 e.printStackTrace() 并与我们分享输出
  • 对不起,我不知道我的头在哪里。我编辑了帖子。
  • 为什么你的异常中没有文件路径?路径是空的吗?

标签: java csv filereader


【解决方案1】:

在 Java 中,Exception 是 Throwable 的子类。 Throwable.getCause() 方法返回“导致该 throwable 被抛出的 throwable”(根据 Javadoc)。这通常可以是null。

改为调用Throwable.getMessage(),这“[r]返回此 throwable 的详细消息字符串”。

【讨论】:

    【解决方案2】:

    我用e.printStackTrace() 替换了System.err.println("Could not read the requested file. Cause: " + e.getCause()); 来得到这个:

    java.io.FileNotFoundException: sample/Data.csv (No such file or directory)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at java.io.FileReader.<init>(FileReader.java:58)
        at xxx.yyy.zzz.PersonReader.readPersons(A.java:37)
        at xxx.yyy.zzz.A.main(A.java:73)
    

    问题是FileReader 无法使用其相对路径找到文件 - 没有相对于当前工作目录的文件“sample/Data.csv”。您可以提供绝对路径,也可以在项目资源中添加文件,您可以执行以下操作:

      InputStream inputStream = PersonReader.class.getClassLoader().getResourceAsStream("sample/Data.csv");
      InputStreamReader streamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
      BufferedReader reader = new BufferedReader(streamReader);
    

    【讨论】:

    • 您收到的错误消息是系统本地的。 OP 可能/将收到不同的错误消息。 FileReader 肯定会采用相对路径。
    • 是的。我认为我的陈述是错误的——我试图解决这个问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2014-08-23
    • 1970-01-01
    • 2019-06-07
    • 2022-11-03
    相关资源
    最近更新 更多