有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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循环中交换了rowi,这意味着循环现在要经过一整行,然后再向下递增到下一行
  • 我将text = fileScanner.nextLine();移动到for循环的内部,这样它就可以真正扫描下一行
  • 我改变了for循环,从0开始计数,而不是从1开始计数(我知道这是个愚蠢的错误)

共 (1) 个答案

  1. # 1 楼答案

    方法FileReader(其名称应以小写字母开头)返回Maze
    但是,这是类级别的属性,因为在try-catch中声明的同名局部变量超出范围
    该类级别属性尚未分配,因此等于null