Проблема с путем файла прямого доступа

Таким образом, вот моя программа, которая работает хорошо:

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.Locale;

public class ScanSum {
    public static void main(String[] args) throws IOException {
        Scanner s = null;
        double sum = 0;
        try {
            s = new Scanner(new BufferedReader(new FileReader("D:/java-projects/HelloWorld/bin/usnumbers.txt")));
            s.useLocale(Locale.US);

            while (s.hasNext()) {
                if (s.hasNextDouble()) {
                    sum += s.nextDouble();
                } else {
                    s.next();
                }
            }
        } finally {
            s.close();
        }

        System.out.println(sum);
    }
}

Как Вы видите, я использую полный путь для файла, из которого я читаю:

s = new Scanner(new BufferedReader(new FileReader("D:/java-projects/HelloWorld/bin/usnumbers.txt")));

Проблема возникает, когда я пытаюсь использовать относительный путь:

s = new Scanner(new BufferedReader(new FileReader("usnumbers.txt")));

Я получаю ошибку:

Exception in thread "main" java.lang.NullPointerException
    at ScanSum.main(ScanSum.java:24)

Файл usnumbers.txt находится в том же каталоге как файл ScanSum.class:

D:/java-projects/HelloWorld/bin/ScanSum.class
D:/java-projects/HelloWorld/bin/usnumbers.txt

Как я мог решить это?

11
задан Richard Knop 18 May 2010 в 19:54
поделиться

4 ответа

Из какого каталога выполняется файл класса? (Это будет текущий рабочий каталог и базовый каталог для относительных путей.)

Если вы просто запустите приложение из eclipse, каталог проекта будет рабочим каталогом, и в этом случае вы должны использовать "bin / usnumbers.txt ".

14
ответ дан 3 December 2019 в 01:00
поделиться

Это должно быть FileNotFoundException, вызывающее NPE в блоке finally. Eclipse по умолчанию выполняет класс с папкой проекта (D:/java-projects/HelloWorld в вашем случае) в качестве рабочего каталога. Поместите файл usnumbers.txt в эту папку и попробуйте. Или измените рабочий каталог в Run Configuration -> Argument tab

3
ответ дан 3 December 2019 в 01:00
поделиться

Если предложение aioobe@ не сработало, и вам нужно узнать, из какой директории запущено приложение, попробуйте записать следующий лог:

new File(".").getAbsolutePath()
26
ответ дан 3 December 2019 в 01:00
поделиться

NullPointerException возникает из-за того, что выражение new FileReader () генерирует исключение FileNotFoundException , а переменная s имеет значение никогда не назначать повторно ненулевое значение.

Файл «usnumbers.txt» не найден, поскольку относительные пути разрешаются (как и во всех программах) относительно текущего рабочего каталога, а не одной из многих записей в пути к классам.

Чтобы решить первую проблему, никогда не присваивайте бессмысленное значение null только для того, чтобы заглушить предупреждения компилятора о неназначенных переменных. Используйте такой шаблон:

FileReader r = new FileReader(path);
try {
  Scanner s = new Scanner(new BufferedReader(r));
  ...
} finally {
  r.close();
}

Для решения второй проблемы измените каталоги на каталог, содержащий «usnumbers.txt», перед запуском java . Или переместите этот файл в каталог, из которого запускается java .

5
ответ дан 3 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: