java NullPointerException试图从方法返回2D对象数组时
我正在做一个作业,我用文本文件阅读器做一个迷宫。我已经做了一个方法,让我选择一个文本文件,并将其转换为一个迷宫,但我有困难从该方法提取迷宫。我在第28行得到一个NullPointerException
,这是:X = Maze[0].length;
我一直在想为什么该方法不返回我的数组,以及如何让该方法返回StartX和StartY位置
package Innlevering09;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import javafx.application.Application;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
public class MazeGame extends Application {
MazeRoute[][] Maze;
int X;
int Y;
int StartX;
int StartY;
Player Player;
public void start(Stage primaryStage) {
try {
GridPane root = new GridPane();
Player Player = new Player(StartX, StartY);
Maze = FileReader();
X = Maze[0].length;
Y = Maze.length;
root.add(Player.getAppearance(), Player.getXpos(), Player.getYpos());
for(int x = 0; x<X; x++){
for(int y = 0; y<Y; y++){
root.add(Maze[x][y].getAppearance(), x, y);
}
}
Scene scene = new Scene(root, X*10, Y*10);
//scene.setOnKeyPressed(new FileListener(this));
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public MazeRoute[][] FileReader() {
String Text = "";
File File;
int Row;
FileChooser FileChooser = new FileChooser();
FileChooser.setTitle("Open a textfile");
FileChooser.getExtensionFilters().add(new ExtensionFilter("Text Files", "*.txt"));
File = FileChooser.showOpenDialog(null);
try (Scanner FileReader = new Scanner(File)){
X = FileReader.nextInt();
Y = FileReader.nextInt();
Text = FileReader.nextLine();
MazeRoute[][] Maze = new MazeRoute[X][Y];
while (FileReader.hasNext()){
Text = FileReader.nextLine();
for (int i = 0 ; i < X ; i++){
for (Row = 0 ; Row < Y ; Row++) {
char Character = Text.charAt(i);
switch (Character){
case '#':
Maze[i][Row] = new Wall(i, Row);
break;
case ' ':
Maze[i][Row] = new NormalTile(i, Row);
break;
case '-':
Maze[i][Row] = new EndTile(i, Row);
break;
case '*':
Maze[i][Row] = new NormalTile(i, Row);
StartX = i;
StartY = Row;
break;
}Row++;
}
}
}
}catch (FileNotFoundException Error) {
System.out.println("Cannot open file");
Error.printStackTrace();
}
return Maze;
}
public static void main(String[] args) {
launch(args);
}
}
编辑:
对于未来的人们,这是我解决问题的代码:
public class MazeGame extends Application {
MazeRoute[][] maze;
int X;
int Y;
int startX;
int startY;
Player player = new Player();
public void start(Stage primaryStage){
try{
maze = fileReader();
player.setXpos(startX);
player.setYpos(startY);
GridPane root = new GridPane();
Scene scene = new Scene(root, Color.BLACK);
Player player = new Player();
for(int x = 0; x<X; x++){
for(int y = 0; y<Y; y++){
root.add(maze[x][y].getAppearance(), maze[x][y].getTileXpos(), maze[x][y].getTileYpos());
}
}
root.add(player.getAppearance(), player.getXpos(), player.getYpos());
primaryStage.setTitle("MazeGame");
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public MazeRoute[][] fileReader() throws FileNotFoundException {
String text = "";
File file;
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open a text file with a maze");
fileChooser.getExtensionFilters().add(new ExtensionFilter("Text Files", "*.txt"));
file = fileChooser.showOpenDialog(null);
Scanner fileScanner = new Scanner(file);
X = fileScanner.nextInt();
Y = fileScanner.nextInt();
text = fileScanner.nextLine();
MazeRoute[][] methodMaze = new MazeRoute [X][Y];
while (fileScanner.hasNext()) {
for (int row = 0 ; row < Y ; row++){
text = fileScanner.nextLine();
for (int i = 0 ; i < X ; i++) {
char character = text.charAt(i);
switch (character) {
case '#':
methodMaze[i][row] = new Wall(i, row);
break;
case ' ':
methodMaze[i][row] = new NormalTile(i, row);
break;
case '-':
methodMaze[i][row] = new EndTile(i, row);
break;
case '*':
methodMaze[i][row] = new NormalTile(i, row);
startX = i;
startY = row;
break;
}
}
}
}
return methodMaze;
}
public static void main(String[] args) {
launch(args);
}
}
我所做的改变如下:
- 我制作了一个新的数组,其中包含迷宫块,以避免出现任何范围问题李>
- 我在
for
循环中交换了row
和i
,这意味着循环现在要经过一整行,然后再向下递增到下一行李> - 我将
text = fileScanner.nextLine();
移动到for
循环的内部,这样它就可以真正扫描下一行李> - 我改变了
for
循环,从0开始计数,而不是从1开始计数(我知道这是个愚蠢的错误)李>
# 1 楼答案
方法
FileReader
(其名称应以小写字母开头)返回Maze
但是,这是类级别的属性,因为在try-catch中声明的同名局部变量超出范围
该类级别属性尚未分配,因此等于
null