Проблема с относительным путем к файлу - PullRequest
11 голосов
/ 18 мая 2010

Итак, вот моя программа, которая работает нормально:

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

Как я мог решить эту проблему?

Ответы [ 6 ]

26 голосов
/ 19 мая 2010

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

new File(".").getAbsolutePath()
14 голосов
/ 18 мая 2010

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

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

5 голосов
/ 19 мая 2010

The 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 выполняется.

3 голосов
/ 19 мая 2010

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

1 голос
/ 10 сентября 2015

Поскольку ваш рабочий каталог - «D: / java-projects / HelloWorld»

@ id pdbartlett отличный, но String filePath = new File(".").getAbsolutePath() выведет "D: / java-projects / HelloWorld /." что нелегко добавить ваш дополнительный относительный путь, например "filePath" + "/ src / main / resources /" + FILENAME, который находится в папке ресурсов.

Я предлагаю String filePath = new File("").getAbsolutePath(), которые возвращают корневую папку проекта

0 голосов
/ 17 ноября 2014

В Eclipse вы также можете посмотреть в «Run Configurations-> Than TAB« Classpath ».

По умолчанию абсолютный путь указан в разделе «Записи пользователя» в [ icon ] ' your.path ' (путь к классу по умолчанию)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...