У меня есть это задание, и я написал код, который считаю логически правильным. Однако, когда я компилирую его и загружаю тестовые примеры, он дает мне InputMismatchException и, кажется, появляется в строке первого "SIT", где ошибки исходили от int, который идет после. Я не могу воспроизвести ошибку в более простой программе. . Может кто-нибудь подсказать, что здесь может быть не так? Сообщите мне, если потребуется дополнительная информация. Спасибо.
Исходный код
import java.util.*;
class Grids {
private void run() {
Scanner sc = new Scanner(System.in);
int count = sc.nextInt();
int numRow = sc.nextInt();
int numCol = sc.nextInt();
int [][] rowByCol = new int [numRow][numCol];
int [] rowFlags = new int[numRow];
int [] colFlags = new int[numCol];
for (int i=0;i<count;i++) {
String cmd = sc.next();
switch (cmd) {
case "SIT": {
int r1 = sc.nextInt();
int c1 = sc.nextInt();
if (rowByCol[r1]==null) {
rowByCol[r1] = new int[numCol];
}
rowByCol[r1][c1] = 1;
rowFlags[r1] = 1;
colFlags[c1] = 1;
}
case "BOX": {
int r1 = sc.nextInt();
int c1 = sc.nextInt();
if (rowByCol[r1]==null || rowByCol[r1][c1]!=1) {
System.out.println("N");
} else {
System.out.println("Y");
}
}
case "ROW": {
int r1 = sc.nextInt();
if (rowFlags[r1]==1) {
System.out.println("Y");
} else {
System.out.println("N");
}
}
case "COL": {
int c1 = sc.nextInt();
if (colFlags[c1]==1) {
System.out.println("Y");
} else {
System.out.println("N");
}
}
default: {
break;
}
}
}
}
public static void main(String[] args) {
Grids newGrids = new Grids();
newGrids.run();
}
}
Вход
11 2 2
SIT 0 1
BOX 0 1
BOX 0 0
BOX 1 1
ROW 0
ROW 1
COL 0
COL 1
SIT 1 1
ROW 1
COL 1
Это простая программа, в которой я пытался воспроизвести ошибку с помощью [Код и 2 набора входных данных в комментариях]
import java.util.*;
class Main {
public static void main(String [] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
String str1 = sc.next();
String str2 = sc.next();
}
}
//2 xyz abc
/*
2
xyz
abc
*/
Это была возможность, о которой я думал, еще не пробовал. У меня не было проблем со сканером до этого конкретного набора данных. Может ли это быть из-за конечных пробелов, которые следуют после каждой строки?
Большинство профессиональных разработчиков Java используют два сканера, один для строк, другой для чисел. Это потому, что легко оказаться в ситуации, когда вы забудете использовать скрытый \n в сканере.
@PrashinJeevaganth Да, абсолютно. Но даже без конечного пробела я думаю, что он все равно должен каким-то образом потреблять \n, поэтому nextLine() необходим.
Вам нужно перейти на следующую строку перед циклом for с помощью sc.nextLine();
@Dylan Ты уверен? Я скорее думаю, что большинство профессиональных разработчиков Java знают, как работает Scanner, и пишут правильный код для работы с ним. Использование двух сканеров для переноса одного и того же потока просто сбивает с толку, и я считаю это плохой практикой. И на самом деле я никогда не встречал профессионального разработчика, который бы использовал несколько сканеров на одном потоке. Можете ли вы уточнить? У вас есть какой-нибудь источник по этому поводу?
Привет, ребята, почему эта проблема не возникает в простой программе, в которой я пытался воспроизвести проблему. Я все еще не убежден в проблеме здесь
Вам не нужно потреблять дополнительную новую строку. next и nextInt так не работают. Вам не хватает break после случаев переключения, поэтому он просто продолжается после SIT и снова вызывает nextInt, когда вы вводите BOX, что вызывает исключение несоответствия ввода.
@GBlodgett вау, это отличный ответ, каким-то образом его добавление работает. Как ни странно, ошибка началась с первого int после "SIT", до будущей позиции break. Обоснование возникновения бага меня до сих пор поражает.
Я, вероятно, должен уточнить свой комментарий выше. Вам не нужно использовать новую строку при вызове next или nextInt после next/nextInt. Если вы смешиваете их с вызовами nextLine(), тогда, вам нужно будет использовать новую строку, откуда берется общий Scanner is skipping nextLine after nextFoo
@PrashinJeevaganth Когда я запустил этот код при первом вызове nextInt в BOX после того, как он провалился через случаи без break
@GBlodgett Хм, значит, ваша ошибка видна только при первом вызове nextInt в BOX, в то время как я видел ее в SIT. это довольно интересно




Пробовали ли вы звонить
sc.nextLine()после окончания переключения? Вероятно, сканер должен использовать символ новой строки, прежде чем перейти к следующей строке.