2011-05-01 118 views
0

我想加载两个机器人在二维阵列中的初始位置,它们由字母N,S,O,E表示。这段代码为什么会产生一个NullPointerException?

以下代码无法正常工作。为什么?

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 
+0

哪条线给NPE? – CoolBeans 2011-05-01 20:35:30

+0

以上代码中的行号是否是指向的异常? – MeBigFatGuy 2011-05-01 20:35:35

回答

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

好像不对。 第一行应该是inputMatrix.length-1

另外“<”应该是“< =”我想。或者保留“<”而没有“长度-1”,而不是“长度”

+0

inputMatrix [0] .length是正常的,我拿出-1并工作。谢谢。 – andandandand 2011-05-01 20:46:08

+1

我不是很确定inputMatrix [0] .length在第一行是正确的。你使用“i”来索引inputMatrix(即你的代码有inputMatrix [i]),所以你应该比较i和inputMatrix的长度。 – 2011-05-01 21:06:25

+0

在这种特殊情况下是正确的,因为两个矩阵具有相同的长度。 – andandandand 2011-05-01 21:12:20

3

有助于提供系统提供给您的错误行号的一个原因是,它使您看到他们也是如此。你会发现你的错误是从该行

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

这是因为helperArray是(长度2)数组的指针。它最初都是空的。它应该在嵌套循环中的某处进行初始化。所以我在打印声明中看到哪些元素被初始化,并看到

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,它仍然是空的。所以这就是为什么你会得到你的错误,我不知道你的代码应该做什么,所以我会让你弄清楚会发生什么。

+0

+1给男人一条鱼,他已经饱了一天,教一个男人去钓鱼,他吃了一辈子。 – MeBigFatGuy 2011-05-01 20:47:14

相关问题