InputMismatchException по неизвестным причинам

У меня есть это задание, и я написал код, который считаю логически правильным. Однако, когда я компилирую его и загружаю тестовые примеры, он дает мне 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
*/

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

BackSlash 13.03.2019 16:35

Это была возможность, о которой я думал, еще не пробовал. У меня не было проблем со сканером до этого конкретного набора данных. Может ли это быть из-за конечных пробелов, которые следуют после каждой строки?

Prashin Jeevaganth 13.03.2019 16:38

Большинство профессиональных разработчиков Java используют два сканера, один для строк, другой для чисел. Это потому, что легко оказаться в ситуации, когда вы забудете использовать скрытый \n в сканере.

Dylan 13.03.2019 16:38

@PrashinJeevaganth Да, абсолютно. Но даже без конечного пробела я думаю, что он все равно должен каким-то образом потреблять \n, поэтому nextLine() необходим.

BackSlash 13.03.2019 16:39

Вам нужно перейти на следующую строку перед циклом for с помощью sc.nextLine();

Ehcnalb 13.03.2019 16:41

@Dylan Ты уверен? Я скорее думаю, что большинство профессиональных разработчиков Java знают, как работает Scanner, и пишут правильный код для работы с ним. Использование двух сканеров для переноса одного и того же потока просто сбивает с толку, и я считаю это плохой практикой. И на самом деле я никогда не встречал профессионального разработчика, который бы использовал несколько сканеров на одном потоке. Можете ли вы уточнить? У вас есть какой-нибудь источник по этому поводу?

BackSlash 13.03.2019 16:42

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

Prashin Jeevaganth 13.03.2019 16:45

Вам не нужно потреблять дополнительную новую строку. next и nextInt так не работают. Вам не хватает break после случаев переключения, поэтому он просто продолжается после SIT и снова вызывает nextInt, когда вы вводите BOX, что вызывает исключение несоответствия ввода.

GBlodgett 13.03.2019 16:45

@GBlodgett вау, это отличный ответ, каким-то образом его добавление работает. Как ни странно, ошибка началась с первого int после "SIT", до будущей позиции break. Обоснование возникновения бага меня до сих пор поражает.

Prashin Jeevaganth 13.03.2019 16:50

Я, вероятно, должен уточнить свой комментарий выше. Вам не нужно использовать новую строку при вызове next или nextInt после next/nextInt. Если вы смешиваете их с вызовами nextLine(), тогда, вам нужно будет использовать новую строку, откуда берется общий Scanner is skipping nextLine after nextFoo

GBlodgett 13.03.2019 16:52

@PrashinJeevaganth Когда я запустил этот код при первом вызове nextInt в BOX после того, как он провалился через случаи без break

GBlodgett 13.03.2019 16:53

@GBlodgett Хм, значит, ваша ошибка видна только при первом вызове nextInt в BOX, в то время как я видел ее в SIT. это довольно интересно

Prashin Jeevaganth 13.03.2019 16:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
12
32
0

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