为什么这段代码会产生NullPointerException?

时间:2011-05-01 20:33:47

标签: java nullpointerexception

我想在二维数组中加载两个机器人的初始位置,它们用字母N,S,O,E表示。

以下代码无效。为什么呢?

static Point[] robotInitialPositions(char [][]inputMatrix){

     Point [] helperArray = new Point[2];

     int aux=0;

     for (int i=0; i<(inputMatrix[0].length-1); i++)
         for (int j=0; j<(inputMatrix[0].length-1); j++)
         {
            if((inputMatrix[i][j]=='N')||(inputMatrix[i][j]=='S')||(inputMatrix[i][j]=='O')||(inputMatrix[i][j]=='E'))
            {
                    helperArray[aux++]= new Point(i,j);                 
            }

         }

     System.out.println("helper array 1: i,j " + helperArray[1].i + ", " + helperArray[1].j);
     //NullPointerException here 
     return helperArray;

 }

完整代码:

package bfs_robots;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

class Point {

    int i;
    int j;

    Point(int i, int j){
        this.i=i;
        this.j=j;
    }

}

public class Main {




 static char turnCounter (char orientation){

     if(orientation=='N')
         return 'O';
     if(orientation=='O')
         return 'S';
     if (orientation=='S')
         return 'E';
     else
         return 'N';

 }

 static char turnClock(char orientation){

      if(orientation=='N')
         return 'E';
     if(orientation=='E')
         return 'S';
     if (orientation=='S')
         return 'O';
     else
         return 'N';

 }

 static Point[] robotInitialPositions(char [][]inputMatrix){

     Point [] helperArray = new Point[2];

     int aux=0;

     for (int i=0; i<(inputMatrix[0].length-1); i++)
         for (int j=0; j<(inputMatrix[0].length-1); j++)
         {
            if((inputMatrix[i][j]=='N')||(inputMatrix[i][j]=='S')||(inputMatrix[i][j]=='O')||(inputMatrix[i][j]=='E'))
            {
                    helperArray[aux++]= new Point(i,j);                 
            }

         }

     System.out.println("helper array 1: i,j " + helperArray[1].i + ", " + helperArray[1].j);

     return helperArray;

 }



static void bfs_find_solution (char[][] inputMatrix){


    int countOfMovements=0;
    //  each turn and displacement adds one

    //  when moved N,S,D and O must be replaced with .
    // * indicates wall, invalid movement

    Point robotInitial[] = robotInitialPositions(inputMatrix);





}









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


        BufferedReader br = new BufferedReader(new FileReader(new File("input.txt")));

        char [][] inputMatrix;

        String line;
        char [] lineAsCharArray;
        int matrixSize;

        while(true){

            line = br.readLine();
            matrixSize=Integer.parseInt(line);

            inputMatrix = new char [matrixSize][matrixSize];

            if (matrixSize==0){  // end outer looping
                break;
            }

            else { //begin inner looping

                for (int i=0; i<matrixSize; i++){

                    line = br.readLine();
                    inputMatrix[i] =line.toCharArray();

                }

                bfs_find_solution(inputMatrix);
            }


        }

    }

}

input.txt(0表示文件结束)

5
D....
N...S
.....
*...*
....D
5
.....
S..S.
.....
.....
D..D.
3
SN.
***
.DD
0

2 个答案:

答案 0 :(得分:4)

     for (int i=0; i<(inputMatrix[0].length-1); i++)         
         for (int j=0; j<(inputMatrix[0].length-1); j++)

似乎错了。 第一行应该是inputMatrix.length-1

另外“&lt;”应该是“&lt; =”我想。或者保持“&lt;”并且没有“length-1”,而只是“length”

答案 1 :(得分:3)

提供系统为您提供的错误行号有帮助的一个原因是它也会让您查看它们。您会注意到您的错误来自此行

System.out.println("helper array 1: i,j " + helperArray[1].i + ", " + helperArray[1].j);

这是因为helperArray是一个指针数组(长度为2)。它最初都是空的。它应该在嵌套循环中的某个地方初始化。所以我输入一个print语句来查看哪些元素被初始化并看到

Setting point 0
Exception in thread "main" java.lang.NullPointerException
    at Main.robotInitialPositions(Main.java:66)
    at Main.bfs_find_solution(Main.java:83)
    at Main.main(Main.java:130)

只有0点被设置。但是你试图打印点1,它仍然是空的。所以这就是你收到错误的原因,我不确定你的代码应该做什么,所以我会让你弄清楚应该发生什么。