Ввод BufferedReader при чтении из файла всегда равен нулю в цикле while - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь прочитать текстовый файл и создать массив. Установка массива с первыми 2 значениями файла, которые появляются в первой строке. Затем добавляем все остальные элементы в файле в массив. Мой массив также всегда равен нулю по некоторым причинам. Какие исправления необходимо сделать, чтобы это работало правильно?

public static Grid createGrid(String filename) throws IOException {
        BufferedReader input;
        String inputLine;
        char[][] grid;
        Grid currentGrid;
        int currentLine = 0;
        try{
            input = new BufferedReader(new FileReader(filename));
            inputLine = input.readLine();
            String[] tokens = inputLine.split(" ");
            if(tokens.length != 2){
                throw new IllegalArgumentException();
            }
            int height = Integer.parseInt(tokens[0]);
            int width = Integer.parseInt(tokens[1]);
            grid = new char[height][width];
            while(inputLine != null){ // Giving me (Condition 'inputLine != null' is always 'true') in ide
                System.out.println(inputLine);
                inputLine = input.readLine();
                for(int i = 0; i < inputLine.length() - 1; i++){
                    char currentGem = inputLine.charAt(i);
                    grid[currentLine][i] = currentGem;
                }
                currentLine++;
            }
            input.close();
            currentGrid = new Grid(grid);
        }
        catch(IOException e){
            System.out.println(e.getMessage());
            currentGrid = null;
        }
        return currentGrid; // Giving me (Value 'currentGrid' is always 'null') in ide
    }

1 Ответ

0 голосов
/ 22 октября 2019

В вашем коде ...

while (inputLine! = Null)

... всегда будет true, потому что inputLine ваш String и всегда будет иметь значение при выполнении этой проверки. Причина в том, что как только вы прочитаете null в inputLine (когда достигнете конца файла), вместо запуска проверки цикла у вас будет NullPointerException, если вы попытаетесь запустить следующую строкукода ... for(int i = 0; i < inputLine.length() - 1; i++). Это, в свою очередь, приведет к тому, что currentGrid всегда будет null, поскольку в тот момент он все еще объявляется как null.

Чтобы это исправить, вам просто нужно добавить inputLine = input.readLine(); перед while изатем переместите эту же строку в вашем while в конец while следующим образом ...

public static Grid createGrid(String filename) throws IOException {
    Grid currentGrid = null;
    try {
        BufferedReader input = new BufferedReader(new FileReader(filename));
        String inputLine = input.readLine();
        String[] tokens = inputLine.split(" ");
        if(tokens.length != 2){
            throw new IllegalArgumentException();
        }
        int height = Integer.parseInt(tokens[0]);
        int width = Integer.parseInt(tokens[1]);
        char[][] grid = new char[height][width];
        int currentLine = 0;
        inputLine = input.readLine(); // added before while
        while(inputLine != null) {
            System.out.println(inputLine);
            for(int i = 0; i < inputLine.length() - 1; i++){
                char currentGem = inputLine.charAt(i);
                grid[currentLine][i] = currentGem;
            }
            currentLine++;
            inputLine = input.readLine(); // last line in while
        }
        input.close();
        currentGrid = new Grid(grid);
    }
    catch(IOException e) {
        System.out.println(e.getMessage());
        currentGrid = null;
    }
    return currentGrid; 
}

О, вы также заметили, что я переместил ваши объявления. Вы не должны объявлять BufferedReader input, String inputLine и char[][] grid за пределами вашего try { ... } catch блока. Также вам нужно только объявить int currentLine = 0; непосредственно перед тем, как вам это понадобится (это просто хорошая практика).

...