Правильно ли я использую класс Scanner и File? - PullRequest
1 голос
/ 29 марта 2019

Я создаю программу Game of Life, которая принимает пользовательские шаблоны ввода, используя java.util.Scanner и java.io.File

Основная проблема в том, что я не могу заставить программу читать файл pattern.txt ...

Я не вижу проблем, pattern.txt находится в той же папке, что и файлы .java и .class, когда я их компилирую.

Правильно ли я использую File и Scanner?

Я попытался изменить порядок операторов import, изменить структуру try & catch и создать новую File(//..Path/../pattern.txt) для прямого вызова файла через относительный путь

1.txt - это файл шаблона:

20 20
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

`

    import java.util.Scanner;
    import java.io.File;
    import java.io.FileNotFoundException;

    public static void main(String [] args) throws FileNotFoundException{

    String inputFileName = "1.txt"; // Directly setting relative path

    int [][] initStates = getInitialStates(inputFileName);

    Grid gd = new Grid(initStates);

    gd.display();
    gd.getStats();
    gd.run();
    }

    public static int [][] getInitialStates(String fileName) {
    try {
        File file = new File(fileName);
    // checks to see if file was created
    //            if (file.exists())
    //                System.out.println("FILE EXISTS");
    //            else
    //                System.out.println("FILENOTFOUDN");
        Scanner input = new Scanner(file);     // Create scanner to read file
        int[][] states = null;
        int rows = input.nextInt();                   // get rows and cols values from first values of text file
        int cols = input.nextInt();
        // states = new int[rows][cols];           // Create 2d array w/ rows and cols
        states = new int[rows][cols];
    //        for (int i = 0; i < rows; i++) {
    //            states[i] = new int[cols];
    //        }

        // Read initial states from the input file
        for (int i = 0; i < states.length; i++) {
            for (int j = 0; j < states[0].length; j++) {
                states[i][j] = input.nextInt();
            }
        }
        return states;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return null;
    }
    //        return states;
}

`

Ошибка вывода: FileNotFoundException при печати трассировки стека:

java.io.FileNotFoundException: 1.txt (No such file or directory)
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.util.Scanner.<init>(Scanner.java:639)
at client.getInitialStates(client.java:67)
at client.main(client.java:24)
Exception in thread "main" java.lang.NullPointerException
at Grid.<init>(Grid.java:14)
at client.main(client.java:26)

Я получаю исключение NullPointerException, поскольку метод getInitialStates () не возвращает массив 2d, поскольку он не может прочитать файл.

1 Ответ

0 голосов
/ 30 марта 2019

Если согласно комментарию выдается FileNotFoundException, это означает, что рабочий каталог вашей программы (т. Е. Каталог, в котором вызывается java YourMainClassName) отличается от местоположения файла, который вы пытаетесьоткрыть по его имени.

Вы можете проверить рабочий каталог:

System.out.println("Working Directory = " + System.getProperty("user.dir"));

Как описано в этом ответе: https://stackoverflow.com/a/7603444/1083697

...