Исключение при чтении данных с клавиатуры - PullRequest
0 голосов
/ 28 мая 2018

Я новичок в Java и пытаюсь читать данные с клавиатуры, но получаю исключение и не знаю, как и как это исправить.

import java.util.Scanner;

    public class Test {
        public static void main(String[] args) {
        Test r = new Test();

        System.out.println("Type a int number      : " + r.readInteger());
        System.out.println("type a double number: " + r.readDouble());
    }

    public int readInteger() {
        Scanner input = new Scanner(System.in);
        int val = 0;

        while(true) {
            if(input.hasNextInt()) {
                val = input.nextInt();
                input.nextLine();
                break;
            }
            else {
                System.out.println("Invalid data type.");
                input.nextLine();
            }
        }

        input.close();

        return val;
    }

    double readDouble() {
        Scanner input = new Scanner(System.in);
        double val = 0;

        while(true) {
            if(input.hasNextDouble()) {
                val = input.nextDouble();
                input.nextLine();
                break;
            }
            else {
                System.out.println("Invalid data type.");
                input.nextLine();
            }
        }

        input.close();

        return val;
    }
}

Исключение:

[roger @ archroger ~] $ java Test

3

Введите int номер:3

Неверный тип данных.

Исключение в потоке "main" java.util.NoSuchElementException: строка не найдена

на java.util.Scanner.nextLine (Scanner.java: 1540)

в Test.readDouble (Test.java:44)

в Test.main (Test.java:8)

1 Ответ

0 голосов
/ 28 мая 2018

Не закрывайте сканер, когда его входной поток равен System.in.Это также закроет стандартный ввод, и операторы типа scanner.nextLine() будут выдавать NoSuchElementException, если вы не проверите, присутствует ли строка.Вы проверяете с помощью scanner.hasNextInt(), доступен ли другой целочисленный токен, и затем пытаетесь получить другую строку с scanner.getNextLine(), не проверяя, существует ли эта строка вообще.Используйте scanner.hasNextLine().

...