2010-05-18 4 views
11

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

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 

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

+0

Можете ли вы пометить номер строки 24 в источнике? – tangens

ответ

13

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

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

+3

Как замечание, размещение вашего приложения и его файлов в JAR-файле и использование метода 'getResourceAsStream'' класса 'позволяет избежать этой проблемы. 's = новый сканер (ScanSum.class.getResourceAsStream (" usnumbers.txt "));' – Powerlord

5

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

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

24

If aioobe @ предложение 's не работает для вас, и вы должны выяснить, какой каталог приложение работает с, попробуйте выполнить следующие действия:

new File(".").getAbsolutePath() 
+1

+1 для отображения способа узнать, от чего работает приложение. Благодаря! – Vikram

+1

Без проблем - рад кому-то полезен после всего этого времени :) – pdbartlett

0

в Eclipse, вы также можете посмотреть в разделе «Run Configurations-> чем TAB "Classpath".

по умолчанию путь Absolut находится в списке "Пользовательские записей" в [значок] ваш.Путь "(по умолчанию классам)

1

С вашей рабочей директории„D:/Java-проекты/HelloWorld“

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

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

Смежные вопросы