Как я могу проверить, если пользовательский ввод не является строкой в ​​java - PullRequest
0 голосов
/ 08 февраля 2020

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

import java.util.Scanner;
public class Details{

    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        String lastname;
        String firstname;
        String middlename;

        System.out.print("Enter Number of passenger : ");
        int passenger = input.nextInt(); 

        for(int x = 0 ; x < passenger ; x++){
            do{
                System.out.print("\nEnter Lastname  :");
                lastname = input.nextLine().trim();

                if(lastname.equals("") || lastname.equals(" "))
                {                 
                    System.out.print("\nEnter Neccessary Details");               
                }
            } while(lastname.isEmpty());

            do{
                System.out.print("\nEnter Firstname : ");
                firstname = input.nextLine();

                if(firstname.equals("") || firstname.equals(" "))
                {
                    System.out.print("\nEnter Neccessary Details");    
                }
            } while(firstname.isEmpty());

            do{
                System.out.print("\nEnter Firstname : ");
                middlename = input.nextLine();

                if(middlename.equals("") || middlename.equals(" "))
                {
                    System.out.print("\nEnter Neccessary Details");    
                }
            }while(middlename.isEmpty());

        }//end of forloop

    }
}

Я уже пробовал этот код, сначала он работает, но в долгосрочной перспективе он показывает логическую ошибку. И выведите мне что-то вроде этого.

    sample output
    Enter Firstname  : // the problem is, it seems has already have an input
    Enter Neccessary Details
    Enter Firstname  :

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

Ответы [ 4 ]

1 голос
/ 08 февраля 2020

Поскольку метод Scanner.nextInt не читает символ новой строки в вашем вводе, вам нужно использовать строку после nextInt:

int passenger = input.nextInt();
input.nextLine();

Это решит , кажется, это уже имеет вход проблема.

Подробнее см. this .

0 голосов
/ 08 февраля 2020

Вы, кажется, хотите создать нескольких пассажиров, а не только один . Так что вам обязательно нужно несколько lastName и firstName. Поэтому создайте класс Passenger, который имеет имя и фамилию. Затем используйте List<Passenger> и создайте новый Passenger на каждой итерации внешнего l oop.

Итак, вы должны это сделать:

class Passenger {
    String lastname;
    String firstname;
    String middlename;
}

Теперь внутри вашего main вам нужен List<Passenger>:

List<Passenger> passengers = new ArrayList<>();

Теперь я бы предложил выделить один метод из ваших трех циклов do-while, чтобы иметь один метод проверки:

String getInput(String kind) {
    String result;
    do{
        System.out.print("\nEnter " + kind + " : ");
        result = input.nextLine().trim();
    } while(result.isEmpty());
}

Наконец, поместите это в ваш l oop в main и создайте новый Passenger на каждой итерации, как упомянуто выше:

static void main(String[] args) {
    List<Passenger> passengers = new ArrayList<>();
    Scanner input = new Scanner(System.in);

    System.out.print("Enter Number of passenger : ");
    Integer numPassengers = input.nextInt(); 

    for(int x = 0; x < numPassengers; x++){
        String firstName = getInut("FirstName");
        String lastName = getInput("LastName");
        String MiddleName = getInput("MiddleName");
        passengers.add(new Passenger(firstName, lastName, middleName);
    }
}

Конечно, вам нужен конструктор для Passenger -класс, который принимает три String -арга. Кроме того, вы никогда не должны открывать поля publi c, как я делал выше, вместо этого используйте метод get get publi c. Итак, ваш класс должен выглядеть так:

class Passenger {
    String firstName;
    String lastName;
    String middleName;

    public Passenger(String firstName, lastName, middleName) { // constructor
        this.firstName = firstName;
        this.lastName = lastName;
        this.middleName = middleName;
    }

    public String getFirstName { return this.firstName; }
    public String getLastName { return this.lastName; }
    public String getMiddleName { return this.middleName; }
}
0 голосов
/ 08 февраля 2020

Сканер, кажется, имеет проблемы из-за использования одного и того же в несколько раз. Попробуйте использовать сканер следующим способом:

public String getInput () {

Scanner sc = new Scanner(System.in);
return sc.nextLine(); 
}

А затем используйте

firstname = getInput();
0 голосов
/ 08 февраля 2020

Вы можете использовать метод trim(), чтобы удалить все пробелы в начале и конце строки, а затем проверить, пусто ли это:

firstname = input.nextLine().trim();

РЕДАКТИРОВАТЬ : Этот код Кажется, работает как вам нужно:

import java.util.Scanner;

public class Details {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String lastname;
        String firstname;
        String middlename;

        System.out.println("Enter Number of passenger : ");
        int passenger = input.nextInt();
        input.nextLine();

        for (int x = 0; x < passenger; x++) {
            do {
                System.out.println("Enter Lastname  :");
                lastname = input.nextLine().trim();
                if (lastname.isEmpty()) {
                    System.out.println("\nEnter Neccessary Details");
                }
            } while (lastname.isEmpty());

            do {
                System.out.println("Enter Firstname : ");
                firstname = input.nextLine().trim();
                if (firstname.isEmpty()) {
                    System.out.println("\nEnter Neccessary Details");
                }
            } while (firstname.isEmpty());

            do {
                System.out.println("Enter Middlename : ");
                middlename = input.nextLine().trim();
                if (middlename.isEmpty()) {
                    System.out.println("Enter Neccessary Details");
                }
            } while (middlename.isEmpty());
        }
    }
}

Основное изменение здесь заключается в том, что я заменил System.out.print на System.out.println. System.out.print каким-то образом печатает только после следующего input.nextLine() чтение завершено (System.out.flush сразу после печати не работает), поэтому кажется, что вы нажимаете кнопку Enter в начале ввода, и эта пустая строка читается Scanner. Также я добавил строку input.nextLine() сразу после чтения passenger count, поэтому Scanner переходит к следующей строке после чтения этого числа.

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