为什么我在这里得到一个NullPointerException

时间:2012-04-30 10:31:54

标签: java nullpointerexception

我正在阅读代表迷宫图案的文本文件。 每行读入1d char数组,然后将一个1d数组插入到2d char数组中。

在以下方法中,在

处获取nullpointerexception
        line = (input.readLine()).toCharArray();

private void fillArrayFromFile() throws IOException 
{

    BufferedReader input = new BufferedReader(new FileReader("maze.txt"));

    //Read the first two lines of the text file and determine the x and y length of the 2d array
    mazeArray = new char[Integer.parseInt(input.readLine())][Integer.parseInt(input.readLine())];

    char [] line = new char[10];

    //Add each line of input to mazeArray
    for (int x = 0; x < mazeArray[0].length; x++) 
    {
        line = (input.readLine()).toCharArray();
        System.out.print(x + " : ");
        System.out.println(line);
        mazeArray[x] = line;
    }
}

2 个答案:

答案 0 :(得分:5)

当没有更多要输入的输入时,

BufferedReader.readLine()返回null。有关详细信息,请参阅Java documentation

答案 1 :(得分:1)

显而易见的答案是input.readLine()正在返回null,并且由于您正在调用一个指向任何内容的对象的方法,因此您获得了NullPointerException

这个问题的根源是你对行和列的感知与文本文件的感知之间的差异。此外,如果我正确地读取您的代码,您将遍历不正确的索引。

以下是一个示例文本文件:

4
6
a b c d
b c d a
a d c a
b d b a
c d a a
b a b a

考虑这个问题的好方法是考虑一下的数量。

例如,上面的文本文件显示“我有4列6行”。

这也意味着x范围从03y的范围从05

在您的术语中,x长度是列数,y长度是行数。

当然,请记住行数越过,列变为向下,假设指数正在增加。

这非常重要。因为x和y基本上是索引到网格中的特定位置。

虽然这可能是原因,但您还会遇到一些语义错误,我将在下面修复。

BufferedReader input = new BufferedReader(new FileReader("maze.txt"));

//Read the first two lines of the text file and determine the x and y length of the 2d array
int mazeWidth = Integer.parseInt(input.readLine());  //A.K.A number of columns
int mazeHeight= Integer.parseInt(input.readLine());  //A.K.A number of rows

//          ranges: [0...3][0...5] in our example
mazeArray = new char[mazeWidth][mazeHeight];

char [] line;

//Add each line of input to mazeArray
for (int y = 0; y < mazeHeight; y++) 
{
    line = (input.readLine()).toCharArray();

    if ( line.length != mazeWidth )
    {
        System.err.println("Error for line " + y + ". Has incorrect number of characters (" + line.length + " should be " + mazeWidth + ").");
    }
    else {
        System.out.print(y + " : ");
        System.out.println(java.util.Arrays.toString(line));
        mazeArray[y] = line;
    }
}