2012-02-13 64 views
1

这里是处理,我需要从.txt文件中填充数组。我心中已经使用的扫描仪类读取每一行,并从INTS得到一个位置存储阵列中的令牌:从.txt填充数组时出现NullPointerException

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Scanner; 

public class Aplicacion { 

    static Elemento _tablero[][] = new Elemento[8][8]; 


    public static Elemento[][] Leertxt() throws FileNotFoundException,IOException 
    { 
     Scanner sc = new Scanner(new File("C:/Users/Owner/Documents/UNIMET/Trimestre 5/Estructura de Datos/Proyecto 1a/src/inicio.txt")); 

     while(sc.hasNext()) 
     { 
      String ln = sc.next();   

      if (ln.equals("Pared")) 
     { 
      int i = sc.nextInt(); 
      int j = sc.nextInt(); 

      _tablero[i][j] = new Pared(i,j);//crea una pared nueva 
     } 
     else if (ln.equals("Fantasma"))  
      { 
      int i = sc.nextInt(); 
      int j = sc.nextInt(); 

      _tablero[i][j] = new Fantasma(i,j);//crea un fantasma nuevo 
     } 
     else if (ln.equals("Vacio")) 
     { 
      int i = sc.nextInt(); 
      int j = sc.nextInt(); 

      _tablero[i][j] = new Vacio(i,j); //crea un vacio 
     } 


    } 


     for(int i=0; i<_tablero.length;i++) 
     { 
      for(int j=0;j<_tablero.length;j++) 
      { 
       if (_tablero[i][j] instanceof Vacio) 
       { 
       _tablero[i][j] = null; 

       _tablero[i][j] = new Punto(i,j); 
      } 
     } 
    }  return _tablero; 
} 

public void mostrar() throws FileNotFoundException, IOException 
{ Elemento[][] tab = Leertxt(); 
    for (int i = 0; i < tab.length; i++) 
    { for(int j = 0;j < tab.length; j++) 
     { 
      System.out.print(" "+ tab[i][j].mostrar(); 
      } 
     System.out.println();//salto de linea 
     } 
} 

它编译,没有错误,但是当我跑我最终得到

Exception in thread "main" java.lang.NullPointerException 
     at Aplicacion.mostrar(Aplicacion.java:73) 
    at JuegoPacman.main(JuegoPacman.java:27) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 3 seconds) 

我不明白它从哪儿得到的线73 的NullPointerException异常的mostrar方法是在Elemento的类的抽象方法,它只是打印一个符号...任何帮助,将愉快地接受

+3

是什么在线73? – Thilo 2012-02-13 05:12:16

+0

'mostrar()'中只有一个取消引用... ...你几乎可以从中推断出行号;) – 2012-02-13 05:28:23

回答

2

因为当你尝试c全部tab[i][j].mostrar() ... tab[i][j]null。你永远不会把一个对象放在数组中的那个位置。

您的Leertxt()方法中没有任何内容确保所有64个位置都接收到对象。

如果你想找出位置就是你的循环更改为:

Elemento[][] tab = Leertxt(); 
for (int i = 0; i < tab.length; i++) 
{ 
    for(int j = 0;j < tab[i].length; j++) 
    { 
     if (tab[i][j] == null) 
      System.out.println("null at location: [" + i + "," + j + "]"); 
     else 
      System.out.print(" "+ tab[i][j].mostrar(); 
    } 
    System.out.println();//salto de linea 
} 
0

布赖恩·罗奇的评论跟进。此外,我建议你添加到:

if (_tablero[i][j] instanceof Vacio) 

要将它扩展为包含空值(我假设在空白区域中,您还将包含空值):

if (_tablero[i][j] instanceof Vacio || _tablero[i][j] == null) 

因此,如果您的文本文件中有某些内容未定义,它将在此处定义。如果你愿意,你甚至可以在检测到一个空方块时抛出一个标记,以确保你追踪空值。

另一种选择将是围绕:

System.out.print(" "+ tab[i][j].mostrar()); 

即问题行73与try/catch块或三元操作:

try{ 
    System.out.print(" "+ tab[i][j].mostrar()); 
} catch (NullPointerException ex){ 
    //haz algo 
} 

或者

System.out.print(" "+ ((tab[i][j] == null) ? "null" : tab[i][j].mostrar()));