Как исправить ошибку FileReader, когда getCause указывает на ноль при чтении CSV-файла? - PullRequest
0 голосов
/ 29 апреля 2019

Я тестирую чтение 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)

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

В Java Exception является подклассом Throwable.Метод Throwable.getCause() возвращает «throwable, из-за которого этот throwable был брошен» (согласно Javadoc).Часто это может быть null.

Вместо этого вызовите Throwable.getMessage(), это «[r] переворачивает строку подробного сообщения этой переменной».

1 голос
/ 29 апреля 2019

Я заменил System.err.println("Could not read the requested file. Cause: " + e.getCause()); на e.printStackTrace(), чтобы получить:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...