2016-05-16 2 views
0

Я использую Eclipse, если это помогает.Доступ запрещен в java.io.FileNotFoundException

Мне нужно получить доступ к файлам в java с помощью сканера, и я использую их для создания объектов. Некоторые объекты имеют зависимости от других объектов, и программа должна вызывать соответствующий метод «строитель» для этих объектов.

Например, у меня есть Effect класс, который используется в Weapon и Artifact класса, которые используются в Enemy класса.

Методы генерации их называют effectBuilder(String fileName), weaponBuilder(String fileName) и т.д. Там нет никаких проблем с каким-либо из этих методов, но метод enemyBuilder(String fileName), который дает мне ошибку java.io.FileNotFoundException: .\doc\Builders (Access is denied). Расположение файла - это то, где я храню текстовые файлы для этих методов.

Метод enemyBuilder выглядит следующим образом:

Класс:

public static Enemy buildEnemy(String fileName) 
{ 
    Scanner sc; 

    //creates Scanner, prints error and returns null if file is not found 

    try { 
     sc = new Scanner(new File("./doc/Builders/"+fileName)); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return null; 
    } 

    //values are put into constructor at the end of the method. 

    String n = sc.nextLine(); 
    int h = sc.nextInt(); 
    int d = sc.nextInt(); 
    int lo = sc.nextInt(); 
    int hi = sc.nextInt(); 
    String g = sc.nextLine(); 

    ArrayList<Weapon> weps = new ArrayList<Weapon>(); 
    while(!g.equals("a") && sc.hasNextLine()){ 
     weps.add(Builder.buildWeapon(g)); 
     g = sc.nextLine(); 
    } 

    ArrayList<Artifact> facs = new ArrayList<Artifact>(); 
    while(sc.hasNextLine()){ 
     facs.add(Builder.buildArtifact(sc.nextLine())); 
    } 

    sc.close(); 

    //converting for constructor purposes 

    Weapon[] warr = new Weapon[weps.size()]; 
    int x = 0; 
    for(Weapon e : weps) 
     warr[x++] = e; 

    Artifact[] aarr = new Artifact[facs.size()]; 
    x = 0; 
    for(Artifact e : facs) 
     aarr[x++] = e; 

    return new Enemy(n, h, d, lo, hi, warr, aarr); 
} 

Других builder методы делают подобные вызовы в другие builder метод для создания новых объектов, но это только один вызывает какие-либо проблемы.

Для справки, вот пример из текстового файла, который используется (информация в деталях скобки, что переменные данные должны быть использованы для):

Warrior (should be n) 
12 (should be h) 
10 (should be d) 
15 (should be lo) 
30 (should be hi) 
battleaxe.txt (first instance of g in 1st loop) 
longsword.txt (second instance) 
a (signifies the computer to move to next while loop) 
battlemedallion.txt (first instance of g in 2nd loop) 
chestplate.txt (second instance) 

Есть ли решение этой проблемы?

ответ

0

Если ошибка действительно это один: java.io.FileNotFoundException: .\doc\Builders (Access is denied) то кажется, что вы пытаетесь открыть каталог, что означает buildEnemy не вызывается с действительным именем файла

+0

Из остальной части сообщения он застревает прямо, когда он пытается вызвать один из методов 'build' с' g' в первый раз. Есть ли что-то, что могло бы заставить его читать неправильную строку? – GoonyKnightMan

+0

Обнаружена ошибка, я думаю, что вызовы 'nextInt()' вызывали какое-то странное поведение со следующими вызовами nextLine() ', переключая их на' next() 'очищали ошибку и позволяли методу работать нормально. Он пытался вызвать метод 'build' с пустой строкой, в которой была проблема. – GoonyKnightMan

+0

@GoonyKnightMan No. Проблема в том, что вы не могли открыть файл. Не удалось создать «Сканер». Вы не могли бы выполнить либо 'next()', либо 'nextInt()'. – EJP

0

ли параметр имя файла пустая строка, то файл не может быть доступен ,

Проверьте права доступа к файлу, в котором у вас нет прав на чтение файла как пользователя, который вы пытаетесь прочитать в файле.