Сканер использует разделитель, но не распознает целое число после него
Кажется, я не могу найти проблему в своем коде, и мне было интересно, если бы вы, замечательные люди здесь, захотели бы помочь мне. Мой профессор требует, чтобы мы создали двумерный массив из информации, взятой из файла, который она нам предоставила. Используя класс Scanner и File, мы сможем добиться этого, однако я столкнулся с проблемой ускорения. Мой сканер не распознает целое число после разделителя, который я для него установил. Вот файл, который она нам предоставляет.
5x7
o,2,3
7,1,3
7,1,1
X,4,2
Эта информация отделяется новыми строками, в которых есть пробелы в цитате.
Вот мой код:
import java.io.*;
import java.util.*;
public class Battlefield {
// Use the FILL_CHAR for a space that contains no creature.
// Use these chars for creatures so that your code will pass
// the tests used for evaluating your program.
public final char FILL_CHAR = '-';
public final char OGRE = 'o';
public final char CENTAUR = '7';
public final char DRAGON = 'X';
private char[][] field;
public Battlefield(String fn) {
try {
// You write code here.
// Read a file and initialize the field.
// The name of the file is passed in from the driver.
// Keep all the file reading stuff in the try/catch block
// to make file exceptions easier to deal with.
File battlefield = new File(fn);
Scanner scan = new Scanner(battlefield);
scan.useDelimiter("x");
int row = scan.nextInt();
System.out.println(row);
System.out.println(scan.next());
System.out.println(scan.hasNextInt());
int column = scan.nextInt();
char[][] field = new char[row][column];
/**
Scanner scan2 = new Scanner(battlefield);
scan2.useDelimiter(",");
/**
field[scan2.nextInt()][scan2.nextInt()] = OGRE;
field[scan2.nextInt()][scan2.nextInt()] = CENTAUR;
field[scan2.nextInt()][scan2.nextInt()] = CENTAUR;
field[scan2.nextInt()][scan2.nextInt()] = DRAGON;
**/
} catch (IOException ex) {
System.err.println(ex.getStackTrace());
}
}
И мой основной метод / класс драйвера:
public class BattlefieldDrv {
public static void main(String[] args)
{
Battlefield battlefieldOne = new Battlefield("1field.dat");
System.out.println(battlefieldOne.toString());
}
}
Вот мой след стека:
> 5
7
o,2,3
7,1,3
7,1,1
X,4,2
false
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Unknown Source)
at java.base/java.util.Scanner.next(Unknown Source)
at java.base/java.util.Scanner.nextInt(Unknown Source)
at java.base/java.util.Scanner.nextInt(Unknown Source)
at Battlefield.<init>(Battlefield.java:38)
at BattlefieldDrv.main(BattlefieldDrv.java:15)
Спасибо за любую помощь или понимание у вас!
1 ответ
Итак, давайте пройдемся по этому коду.
scan.useDelimiter("x");
int row = scan.nextInt();
5 читается в row
,
System.out.println(row);
5 печатается.
System.out.println(scan.next());
Остальная часть файла читается и печатается, потому что это то, что идет после x
,
System.out.println(scan.hasNextInt());
Больше нечего читать, поэтому NoSuchElementException
брошен здесь.
Вы должны заставить сканер также принимать переводы строк как разделитель; Вы можете сделать это с помощью
scan.useDelimiter("(x|\\s)");
(The \\s
это шаблон для "любого пробела").
Как примечание стороны, это хорошая практика использовать try-with-resources
-construct:
try (Scanner scan = new Scanner(Paths.get("1field.dat"))) {
scan.useDelimiter(...);
...
} catch (IOException e) {
Это приведет к тому, что ваш файловый ресурс будет закрыт автоматически.