当前位置: 首页 > 知识库问答 >
问题:

while循环中读取文件时的BufferedReader输入始终为空

曹高轩
2023-03-14

我正在尝试读取文本文件并创建数组。使用文件的前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个答案

岳浩
2023-03-14

在您的代码中...

while(inputLine!=null)

...将始终为true,因为inputline是您的字符串并且在运行此检查时它将始终具有值。原因是,一旦您将null读取到inputline中(当您到达文件末尾时),而不是运行循环检查,您将在尝试运行下一行代码时抛出nullPointerException...用于(int i=0;i 。这又将导致 currentgrid始终为 null,因为在这一点上它仍然声明null

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; 
}

 类似资料:
  • 我试图通过使用Kryonet进行通信来创建一个基本的IRC。我遇到的问题是,在我的代码中,我不能安全地使用允许用户键入和发送消息的main while循环,因为Scanner给出了一个错误,并且似乎跳过了对nextLine()的调用。我想做的是让扫描仪在继续之前等待用户输入。 更准确地说,程序将首先在行的开头放一个“:”,然后在用户按enter键后获取用户键入的任何内容,然后将其发送到服务器。我得

  • 问题内容: 我一生无法理解为什么我无法在while循环之外阅读postPrioity。我尝试过“ export postPrioity =“ 500””仍然无法正常工作。 有任何想法吗? -或在计划文字中- 输出:(我在files.txt中只有3个文件名) 问题答案: 管道操作员创建一个子外壳,请参阅BashPitfalls和BashFAQ。解决方案:不要使用,反正毫无用处。

  • 对于我的程序,我要编写一个程序,它接受2到10之间的行数。生成n行的乘法三角形。每行包含的条目不超过其行大小。这一点我没有问题。但是,在用户将数字0输入到我的问题“请输入要打印的行数:”之后,应该终止循环并打印“感谢您使用此程序!”我用了一个DO。。。WHILE循环以确定用户是否希望继续。在我的循环中,我将用户想要打印的数字声明为int num。我的循环应该持续到num

  • 我正在设置一个,它在用户输入整数之前一直执行。但是,按照我现在的方式,循环在输入整数后再次打印消息,然后程序正常执行。有人能建议一种方法来使输入整数后不再打印该消息吗?谢了!

  • 问题内容: 我了解Scanner的优点,以及何时使用Scanner和BufferedReader。我读了一个不同的问题,但在一些类似的问题中,它的问题是Scannervs. BufferedReader 当我从输入中读取内容时,为什么Scanner这么慢? 我认为这与Scanner中有一个小的缓冲区有关,但是在这里我迷路了。最初的问题来自 Codechef,但我对该解决方案不感兴趣。 这是具有给定

  • 我有一个名为“add”的方法,它将字符串作为参数,并使用bufferedwriter将其写入文件。完成此操作后,bufferedwriter将被刷新。 在另一个方法“read”中,我遍历文件中的行,但这些行是空的(因此我不能打印它们)。