Исключение NullPointer при использовании SelectInput () - PullRequest
1 голос
/ 19 марта 2019

Я пишу игру в Processing 3.x и пытаюсь использовать SelectInput ();метод для загрузки в различные файлы сохранения игры.Однако я продолжал получать исключения NullPointer, которые я не могу исправить.Я продолжаю пытаться запустить функцию SelectInput ДО функции loadGame, но программа все равно падает.В настоящее время в приведенном ниже коде программа выдает ошибку в строке, которая читается как 'columns = splitTokens (row [1]);'

Любая помощь, чтобы этот код снова заработал, будет очень признателен.

Код:

PImage tile1;
PImage tile2;
PImage tile3;
PImage tile4;
PImage tile5;
PImage tile6;
PImage tile7;
PImage tile8;

String input;

String rows[];
String columns[];
int array2D[][];

boolean gameLoaded = false;

void setup() {
  size(600, 600);
  background(0);
  frameRate(30);

  tile1 = loadImage("grass0.png");
  tile2 = loadImage("grass1.png");
  tile3 = loadImage("grass2.png");
  tile4 = loadImage("tile1.png");
  tile5 = loadImage("tile2.png");
  tile6 = loadImage("tree.png");
  tile7 = loadImage("tree2.png");
  tile8 = loadImage("tile2.png");

  selectInput("Select a file to process:", "fileSelected");

  if (gameLoaded == false) {
    //selectInput("Select a file to process:", "fileSelected");
    loadGame();
    gameLoaded = true;
  }
}


void draw() {
  if (gameLoaded == true) {
    for (int a = 0; a < rows.length; a++) {
      for (int b = 0; b < columns.length; b++) {
        if (array2D[a][b] == 1) {
          image(tile1, a * 100, b * 100);
        }
        if (array2D[a][b] == 2) {
          image(tile2, a * 100, b * 100);
        }
        if (array2D[a][b] == 3) {
          image(tile3, a * 100, b * 100);
        }
        if (array2D[a][b] == 4) {
          image(tile4, a * 100, b * 100);
        }
        if (array2D[a][b] == 5) {
          image(tile5, a * 100, b * 100);
        }
        if (array2D[a][b] == 6) {
          image(tile6, a * 100, b * 100);
        }
        if (array2D[a][b] == 7) {
          image(tile7, a * 100, b * 100);
        }
        if (array2D[a][b] == 8) {
          image(tile8, a * 100, b * 100);
        }
      }
    }
  }
}


void loadGame() {
  //rows=loadStrings("file.txt");
  rows = loadStrings(input);

  columns = splitTokens(rows[1]);

  array2D = new int[rows.length][columns.length];

  println("There are " + rows.length + " rows");
  println("There are " + columns.length + " columns");


  for (int a = 0; a < rows.length; a++) {
    columns = splitTokens(rows[a]);

    for (int b = 0; b < columns.length; b++) {
      array2D[a][b] = Integer.parseInt(columns[b]);
    }
  }
}

void fileSelelected(File selection) {
  if (selection == null) {
    println("Nothing was selected, so nothing happens");
  } else {
    input = selection.getAbsolutePath();
    //rows=loadStrings(input);
  }
}

1 Ответ

0 голосов
/ 19 марта 2019

Легко читать, но документация предполагает, что селектор файлов работает в отдельном потоке. Это означает, что ваша программа не ждет, пока файл будет выбран и функция selectInput завершена. Вместо этого он продолжает обрабатывать ваш код до тех пор, пока не будет выбран файл, затем нормальная обработка прерывается для обработки функции fileSelected.

В вашем коде это означает, что loadGame() всегда будет работать до того, как у вас появится возможность выбрать файл. Решением является создание переменной, которая проверяет, был ли выбран файл.

В верхней части вашего кода создайте переменную:

boolean isFileSelected = false;

Перед загрузкой игры проверьте, был ли выбран файл:

 if (gameLoaded == false && isFileSelected == true) {
    loadGame();
    gameLoaded = true;
  }

Когда файл выбран, измените переменную:

void fileSelelected(File selection) {
  if (selection == null) {
    println("Nothing was selected, so nothing happens");
  } else {
    input = selection.getAbsolutePath();
    isFileSelected = true;
  }
}

Если это еще не полностью ясно, следующий сценарий может помочь понять концепцию. Как только программа запустится, она продолжит печатать start, пока вы не выберете файл.

String test = "start";

void setup() {
  selectInput("Select a file to process:", "fileSelected");
}

void draw(){
   println(test);
}

void fileSelected(File selection) {
  if (selection == null) {
    println("Window was closed or the user hit cancel.");
  } else {
    println("User selected " + selection.getAbsolutePath());
    test = "test";
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...