Как использовать несколько сканеров разных типов в Java? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть этот код на Java (выполняется на консоли Eclipse по умолчанию):

String name = "";
    System.out.printf("Name of the Story Arc:  ");

    if(in.hasNext()) {
        name = in.nextLine();
    }

    int l = 0;
    System.out.printf("Length of the Story Arc:  ");
    if(in.hasNextInt()) {
        l = in.nextInt();
    }

    StoryArc a = new StoryArc(name, id, issues_nb + 1, l);
    story_arcs.add(a);

Я пытаюсь выполнить его несколько раз подряд, но он ведет себя странно: Первое выполнение работает нормально, спрашивая имя, затем длину. При втором выполнении запрашивается имя, но не длина (устанавливается на 0). Третье выполнение запрашивает длину, но задает имя равным "", и оно повторяется таким образом, с длиной для четных и именем для нечетных.

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

редактирование: Спасибо вам всем! С вашей помощью нам удалось заставить его работать!

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Вам необходим цикл while, чтобы получить действительный name, а также
вам нужен while цикл с try/catch, чтобы получить l, потому что пользователь может ввести недопустимое значение вместо действительного целого числа:

String name = "";
while (name.trim().length() == 0) {
    System.out.print("Name of the Story Arc:  ");
    name = in.nextLine();
}

int l = 0;
boolean valid = false;
while (!valid) {
    try {
        System.out.print("Length of the Story Arc:  ");
        l = in.nextInt();
        valid = (l > 0);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
0 голосов
/ 16 ноября 2018

Попробуйте это. У вашего кода нет проблем, но после запуска это может помочь вам

import java.util.*;

public class Answer {


    public static void main(String[] args) {

        String name = "";
        System.out.printf("Name of the Story Arc:  ");
        Scanner in = new Scanner(System.in);
        if(in.hasNext()) {
            name = in.nextLine();
        }

        int l = 0;
        System.out.printf("Length of the Story Arc:  ");
        if(in.hasNextInt()) {
            l = in.nextInt();
        }

        System.out.println("Name of the Story Arc: "+name);
        System.out.println("Length of the Story Arc:  "+l);


    }

}
0 голосов
/ 16 ноября 2018

l = in.nextInt() получит только целое число, но не означает, что вы закончили ввод этой строки, поэтому вам придется сообщить об этом сканеру самостоятельно.Есть два способа сделать это:

Вы можете сделать in.nextLine();, чтобы указать, что мы закончили со строкой, содержащей целое число:

Изменить l = in.nextInt(); на:

l = in.nextInt();
if(in.hasNext()){
  // Ignore the rest of the line that contained the length integer-input:
  in.nextLine();
}

Попробуйте онлайн.

В качестве альтернативы вы можете использовать in.nextLine() для всех ваших входных данных и преобразовать строку в целое число самостоятельно:

Изменить l = in.nextInt(); на:

String input = in.nextLine();
// Verify the entire line only contains the integer:
if(input.matches("\\d+")){
  l = Integer.parseInt(input);
} else{
  // TODO: Validation message: not a valid integer
}

Попробуйте онлайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...