从.txt填充数组时出现NullPointerException

时间:2012-02-13 05:11:19

标签: java nullpointerexception

这是交易,我需要从.txt文件填充一个数组。我使用Scanner类来读取每一行,并从Ints获取一个位置,以便将令牌存储在数组中:

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类中的抽象方法,它只打印一个符号......任何帮助都会被愉快地接受

2 个答案:

答案 0 :(得分:2)

因为当您尝试致电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
}

答案 1 :(得分:0)

继续关注Brian Roach的评论,我建议你加入:

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

要将其展开以包含空值(我假设在空白处,您还会包含null):

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

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

另一种选择是环绕:

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

即带有try / catch块或三元操作的问题第73行:

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()));