Не удается заставить сканер читать из файла

Я делаю игру Battle Royale в командной строке, и у меня есть имена и фамилии ботов в двух текстовых файлах. Теперь я пытаюсь прочитать эти два файла с помощью двух сканеров, затем помещаю имена в один массив и фамилии в другой массив.

Игра объектно-ориентированная, поэтому в ней 3 файла:

Файл №1 (приложение)

package tp2;

public class App {

    public static void main(String[] args) throws InterruptedException {
        Game game = new Game();
        game.start();
    }    
}

Файл №2 (Игра)

package tp2;

public class Game {

    private Level currentLevel;
    private Player player;

    public void start() throws InterruptedException {
        World.createNameArrays();
        World.printNamesArrays();              
    }
}

Файл №3 (Мир)

package tp2;

import java.io.*;
import java.util.*;
import java.util.concurrent.TimeUnit;

public class World {
    private static final int MAX_PLAYERS = 42;
    private static String firstNamesArray[] = new String[MAX_PLAYERS];
    private static String lastNamesArray[] = new String[MAX_PLAYERS];
    private static Player players[] = new Player[MAX_PLAYERS];

    private static Scanner scannerFirstNames;
    private static Scanner scannerLastNames;

    public static void printNamesArrays() {
        System.out.println("");
        System.out.println("First names available");
        System.out.println("---------------------");
        for (int i = 0; i < MAX_PLAYERS; ++i) {
            System.out.println(firstNamesArray[i]);
        }
        System.out.println("");
        System.out.println("Lats names available");
        System.out.println("---------------------");
        for (int i = 0; i < MAX_PLAYERS; ++i) {
            System.out.println(lastNamesArray[i]);
        }
    } 

    public static void createNameArrays() {        
        openNameFiles();
        int i = 0;
        while (scannerFirstNames.hasNext() && scannerLastNames.hasNext()) {
            System.out.println("**********Test*************");
            firstNamesArray[i] = scannerFirstNames.nextLine();
            lastNamesArray[i] = scannerLastNames.nextLine();
            ++i;            
        }
        closeNameFiles();
    }

    public static void closeNameFiles() {
        scannerFirstNames.close();        
        scannerLastNames.close();
    }

    public static void openNameFiles() {
        try {
            scannerFirstNames = new Scanner(new File("firstnames.txt"));
        } catch(FileNotFoundException e) {
            System.out.println("Error! File not found.");
        }
        try {
            scannerLastNames = new Scanner(new File("lastnames.txt"));
        } catch(FileNotFoundException e) {
            System.out.println("Error! File not found.");
        }        
    }
}

Для пояснения я сделал метод для печати имен и фамилий из двух массивов, но он просто печатает «NULL», когда я выполняю метод. Это просто означало бы, что сканеры не могут прочитать два файла по каким-то причинам...

Обратите внимание, что static на самом деле не является объектно-ориентированным, особенно статические поля!

Julian 28.02.2019 20:33

Рекомендуется научиться отлаживать, например vogella.com/tutorials/EclipseDebugging/article.html

Julian 28.02.2019 20:34

Попробуйте использовать объект FileReader вместо сканера. Хорошо, если вы только начинаете изучать Java.

Howard P 28.02.2019 20:35

Вы уверены, что файлы правильно отформатированы? Этот код работает (проверено).

LppEdd 28.02.2019 20:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
56
1

Ответы 1

Вы можете изменить функцию createNamesArray() и избавиться от closeNameFiles() и openNameFile().

Я обновил ваш World.java (если вы используете java:8)

public class World {

  private static final int MAX_PLAYERS = 42;
  private static String firstNamesArray[] = new String[MAX_PLAYERS];
  private static String lastNamesArray[] = new String[MAX_PLAYERS];
  private static int firstNameEntriesInFile;
  private static int lastNameEntriesInFile;

  public static void printNamesArrays() {
    System.out.println("");
    System.out.println("First names available");
    System.out.println("---------------------");
    for (int i = 0; i < MAX_PLAYERS && i < firstNameEntriesInFile; ++i) {
      System.out.println(firstNamesArray[i]);
    }
    System.out.println("");
    System.out.println("Lats names available");
    System.out.println("---------------------");
    for (int i = 0; i < MAX_PLAYERS && i < lastNameEntriesInFile; ++i) {
      System.out.println(lastNamesArray[i]);
    }
  }

  public static void createNameArrays() {
    try {
      String[] fNames = Files.lines(new File("fullpath/firstname.txt").toPath()).toArray(String[]::new);
      if (fNames.length == 0) {
        throw new RuntimeErrorException(null, "no first name entry found in the given file");
      } else {
       firstNameEntriesInFile=fNames.length;
       firstNamesArray=fNames;
      }
      String[] lNames = Files.lines(new File("fullpath/lastname.txt").toPath()).toArray(String[]::new);
      if (lastNamesArray.length == 0) {
        throw new RuntimeErrorException(null, "no last name entry found in the given file");
      }else {
        lastNameEntriesInFile=lNames.length;
        lastNamesArray=lNames;
       }
    } catch (IOException e) {
      e.printStackTrace();
      System.out.println("file can't be accessed: cause " + e.getMessage());
    }
  }
}

Тем не менее, если вы хотите сделать это по-своему, я предлагаю использовать FileReader

Я бы порекомендовал использовать ArrayList, который обрабатывает динамические размеры, тогда как для массива потребуется заранее определенный размер, который вы можете знать или не знать. Глядя на ваш код, я вижу, что вы уже определили размер.

BufferedReader in = new BufferedReader(new FileReader("fullpath/firstnames.txt"));
String str;

List<String> list = new ArrayList<String>();
while((str = in.readLine()) != null){
    list.add(str);
}

firstNamesArray = list.toArray(new String[list.size()]);

аналогично для массива фамилий.

Кроме того, нецелесообразно использовать статический в первую очередь по той причине, что безопасность потоков является второй объектно-ориентированной концепцией.

Не волнуйтесь, мы все когда-то были на вашем месте, а потом со временем научились. Не так уж и важно!

Другие вопросы по теме