NoSuchElementException с использованием сканера

Может кто-нибудь объяснить мне, почему в строке 19 компилятор выдает мне исключение? Я просто не могу понять это ... Я решаю некоторые упражнения на HackerRank, и я знаю, что есть решения, но мой код работает отлично, пока 1 тестовый пример не выдает исключение. И я просто не могу понять это, несмотря на то, что я читал сообщения в блоге об этом.

    import java.util.*;
    import java.io.*;
    import java.util.Scanner;

    class Solution{

        public static void main(String []args) {
            Scanner scanner = new Scanner(System.in);

            Map<String, String> contactBook = new HashMap<>();

            int n = scanner.nextInt();
            scanner.next();

            for(int i = 0; i < n; i++) {
                String name = scanner.nextLine();

                String phoneNumber = scanner.nextLine();

                contactBook.put(name, phoneNumber);
            }

            while(n-- > 0) {
                String search = scanner.nextLine();
                if(contactBook.containsKey(search)) {
                    System.out.println(search + "=" + contactBook.get(search));
                } else {
                    System.out.println("Not found");
                }
            }


        }
    }

person Hegyi Levente    schedule 30.03.2020    source источник
comment
Измените строку scanner.next(); сразу после int n = scanner.nextInt(); на scanner.nextLine(). Вот почему это должно помочь.   -  person Kevin Anderson    schedule 30.03.2020
comment
Прежде всего, начните с тура и прочитайте Как спросить. В частности, в вашем вопросе отсутствует сообщение об ошибке, и код также может быть сокращен, чтобы он приближался к минимально воспроизводимому примеру. Кроме того, сначала вы говорите, что это компилятор, а затем вы говорите, что это тестовый пример. Что происходит на самом деле?   -  person Ulrich Eckhardt    schedule 30.03.2020


Ответы (2)


Вы должны решить следующие вещи в своем коде:

  1. Используйте nextLine() вместо nextInt() и next(). Проверьте Сканер пропускает nextLine() после использования next() или nextFoo ()? для получения дополнительной информации.
  2. Хотя это и не является обязательным требованием, всякий раз, когда вы запрашиваете ввод от пользователя, вы всегда должны печатать сообщение, описывающее ввод.
  3. Вероятно, ваше требование состоит в том, чтобы хранить контакты с именем в качестве ключа, это не очень хороший дизайн. Если вы попытаетесь поставить другой контакт с таким же именем, старый контакт будет заменен новым, так как карта заменит старую запись на новую с тем же ключом. Вы должны хранить данные на карте с уникальными ключами, и в этой ситуации уникальным ключом может быть номер телефона и какой-либо другой уникальный идентификатор, который вы можете придумать.
  4. Вы должны запросить ввод для поиска контакта вне цикла while; в противном случае пользователю будет предложено n раз ввести имя для поиска в книге контактов.
  5. Как только имя будет найдено в книге контактов, не забудьте break замкнуть цикл. Если цикл не прерывается (т. е. имя не найдено на карте), значение n в конечном итоге станет -1, которое вы можете использовать для вывода сообщения о том, что имя не найдено.

Ниже приведен код, включающий пункты, упомянутые выше:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = 0;
        boolean valid;
        Map<String, String> contactBook = new HashMap<>();
        do {
            valid = true;
            System.out.print("Enter the number of contacts to be saved: ");
            try {
                n = Integer.parseInt(scanner.nextLine());
                for (int i = 0; i < n; i++) {
                    System.out.println("---Contact#" + (i + 1) + "---");
                    System.out.print("Enter the name: ");
                    String name = scanner.nextLine();
                    System.out.print("Enter the phone number: ");
                    String phoneNumber = scanner.nextLine();
                    contactBook.put(name, phoneNumber);
                }
            } catch (NumberFormatException e) {
                System.out.println("This is an invalid entry. Please try again.");
                valid = false;
            }
        } while (!valid);

        System.out.print("Enter the name to serach in the contact book: ");
        String search = scanner.nextLine();
        while (n-- > 0) {
            if (contactBook.containsKey(search)) {
                System.out.println(search + "=" + contactBook.get(search));
                break;
            }
        }
        if (n < 0) {
            System.out.println("Not found");
        }
    }
}

Пример запуска:

Enter the number of contacts to be saved: 3
---Contact#1---
Enter the name: Arvind
Enter the phone number: 1234567890
---Contact#2---
Enter the name: Kumar
Enter the phone number: 1023456789
---Contact#3---
Enter the name: Avinash
Enter the phone number: 2013456789
Enter the name to serach in the contact book: Kumar
Kumar=1023456789

Еще один пробный запуск:

Enter the number of contacts to be saved: 2
---Contact#1---
Enter the name: Hegyi
Enter the phone number: 1234567890
---Contact#2---
Enter the name: Levente
Enter the phone number: 1023456789
Enter the name to serach in the contact book: Hello
Not found

Еще один пробный запуск:

Enter the number of contacts to be saved: abc
This is an invalid entry. Please try again.
Enter the number of contacts to be saved: 10.5
This is an invalid entry. Please try again.
Enter the number of contacts to be saved: 2
---Contact#1---
Enter the name: Test1
Enter the phone number: 123
---Contact#2---
Enter the name: Test2
Enter the phone number: 234
Enter the name to serach in the contact book: Test2
Test2=234
person Arvind Kumar Avinash    schedule 30.03.2020
comment
Спасибо за ваши усилия, которые вы приложили, чтобы объяснить мне это. Я получил все баллы. Также спасибо за переписывание кода! Очень помог! Палец вверх за тебя :D - person Hegyi Levente; 01.04.2020
comment
@HegyiLevente - Добро пожаловать. Желаю тебе успеха! - person Arvind Kumar Avinash; 01.04.2020

Сменить сканер.next(); для сканера.nextLine(); Как объясняется в этой ссылке https://stackoverflow.com/a/24773533/7877099

import java.util.*;
import java.io.*;
import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        Map<String, String> contactBook = new HashMap<>();
        int n = scanner.nextInt();
        scanner.nextLine();
        for (int i = 0; i < n; i++) {
            String name = scanner.nextLine();

            String phoneNumber = scanner.nextLine();

            contactBook.put(name, phoneNumber);
            System.out.println(name + "  -  " + phoneNumber);
        }

        while (n-- > 0) {
            String search = scanner.nextLine();
            if (contactBook.containsKey(search)) {
                System.out.println(search + "=" + contactBook.get(search));
            } else {
                System.out.println("Not found");
            }
        }

    }
}
person Isuru Dilshan    schedule 30.03.2020