Сканер не останавливается, чтобы получить ввод - PullRequest
4 голосов
/ 23 сентября 2010

Хорошо, очень нубский вопрос.Я делаю приложение CLI, которое позволяет пользователям создавать опросы.Сначала они вводят вопрос, затем число вариантов и вариантов.Я использую Сканер, чтобы получить ввод, и по какой-то причине он позволяет пользователю вводить большинство вещей, но не текст вопроса.Фрагмент кода ниже.

String title = "";
Question[] questions;
int noOfQuestions = 0;
int[] noOfChoices;
Scanner entry = new Scanner(System.in);
System.out.println("Please enter the title of the survey: ");
title = entry.nextLine();
System.out.println("Please enter the number of questions: ");
noOfQuestions = entry.nextInt();
noOfChoices = new int[noOfQuestions];
questions = new Question[noOfQuestions];
for (int i = 0; i < noOfQuestions; i++) {
    questions[i] = new Question();
}
for (int i = 0; i < noOfQuestions; i++) {

    System.out.println("Please enter the text of question " + (i + 1) + ": ");
    questions[i].questionContent = entry.nextLine();
    System.out.println("Please enter the number of choices for question " + (i + 1) + ": ");
    questions[i].choices = new String[entry.nextInt()];
    for (int j = 0; j < questions[i].choices.length; j++) {
        System.out.println("Please enter choice " + (j + 1) + " for question " + (i + 1) + ": ");
        questions[i].choices[j] = entry.nextLine(); 

    }
}

Спасибо:)

Ответы [ 2 ]

5 голосов
/ 23 сентября 2010

Причина, по которой я спросил о том, считываете ли вы noOfQuestions со сканера, заключается в том, что Scanner.nextInt() не использует разделитель (например, новую строку).

Это означает, что при следующем вызове nextLine() вы просто получите пустую строку из предыдущего readInt().

75\nQuestion 1: What is the square route of pie?
^ position before nextInt()

75\nQuestion 1: What is the square route of pie?
  ^ position after nextInt()

75\nQuestion 1: What is the square route of pie?
    ^ position after nextLine()

Я предлагаю просто читать по строке, всегда с nextLine(), а затем анализировать, используя Integer.parseInt().

Если вы выберете такой маршрут, вам вообще не понадобится сканер; Вы можете просто принять BufferedReader.

0 голосов
/ 23 сентября 2010

Документация для nextLine () говорит Продвигает этот сканер за текущую строку и возвращает пропущенный ввод. Может объяснить поведение, которое вы видите. Просто чтобы убедиться, что вы можете добавить sysout и напечатать значение title после title = entry.nextLine() и посмотреть, какое значение оно содержит

Если вы хотите прочитать полную строку из ввода, вы можете использовать комбинацию InputStreamReader с BufferedReader .

...