这是交易,我需要从.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类中的抽象方法,它只打印一个符号......任何帮助都会被愉快地接受
答案 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()));