2011-05-01 122 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

相關問題