Чтение текстового файла в символ[][] с помощью try / catch в Java

#java #arrays #char #maze

#java #массивы #символ #Лабиринт

Вопрос:

Я пытаюсь прочитать текстовый файл лабиринта в массив с двойным символом, текстовый файл отформатирован следующим образом (с двумя целыми числами, равными количеству строк и столбцов соответственно):

 10 10
##########
#        #
#   ###  #
#   #  G #
#   #    #
#        #
#        #
#  #######
#   S    #
##########
  

Мой код до сих пор:

 public char[][] readFile(String filename) {
    char[][] maze = null;
    try {
        Scanner scan = new Scanner(new File(filename));
        int rows = scan.nextInt();
        int columns = scan.nextInt();

        maze = new char[rows][columns];
        String line;

        do {
            for (int i = 0; i < rows; i  ) {
                line = scan.nextLine();
                for (int j = 0; j < columns; j  ) {
                    maze[i][j] = line.charAt(j);
                }
            }
        } while (scan.hasNextLine());

        scan.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return maze;
}
  

Я не знаю, как вернуть массив за пределы блока try / catch. Другие сообщения, проходящие через это, вызывают исключения, которые я не могу выполнить из-за реализации интерфейса.

Я знаю, что инициализация массива в значение null устраняет любые красные флажки, но затем он выдает StringIndexOutOfBounds в консоли.

Извините за уродливый код, но я не так много кодировал с файловым вводом / выводом.

Комментарии:

1. Каким должно быть поведение, если файл не найден?

2. можете ли вы подробнее рассказать о 88I не знаю, как вернуть массив за пределы блока try / catch. **? можете ли вы также опубликовать полученное вами исключение?

3. Да, я не уверен, что понимаю ваш вопрос. Вы хотите, чтобы изменения в блоке try / catch отражались в вашей переменной за пределами try / catch? Потому что Java уже делает это.

Ответ №1:

Ваш алгоритм в порядке. Ему просто не хватает вызова scan.nextLine() перед входом в первый цикл, чтобы сканер соответствовал концу первой строки.

Что касается обработки исключений, это должно быть так:

 public char[][] readFile(String filename)
{
    char[][] maze;
    try
    {
        ...
        maze=<a useful value>
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
        maze=<a default value, maybe null>
    }
    return maze;
}
  

Значение по умолчанию должно быть указано в реализуемом вами интерфейсе. В противном случае выбросить RuntimeException из catch блока было бы меньшим из двух зол.

Ответ №2:

вы читаете слишком много строк…

давайте предположим, что ваш файл содержит 12 строк, 1 строку для размера, 10 строк для лабиринта и 12-ю строку с некоторыми другими входными данными.

ваш код отлично работает для первых 11 строк, но когда ваш код закончен, вам следует прекратить читать дальше!

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

 boolean doneReading = false;
do {
    if(!doneReading){
        for (int i = 0; i < rows; i  ) {
            line = scan.nextLine();
            for (int j = 0; j < columns; j  ) {
                maze[i][j] = line.charAt(j);
            }
        }
        //now we have all input, now we can stop reading further
        doneReading = true;
    }
} while (scan.hasNextLine());
  

вместо того, чтобы читать полный файл, вы могли бы просто вернуть результат, как только вы его прочитали

(альтернативная версия: возвращайтесь, как только сможете)

 do {
    for (int i = 0; i < rows; i  ) {
        line = scan.nextLine();
        for (int j = 0; j < columns; j  ) {
            maze[i][j] = line.charAt(j);
        }
    }
    //now we have all input, now we even return
    return maze;
} while (scan.hasNextLine());