【问题标题】:How can i check if the user input is not string in java我如何检查用户输入是否不是java中的字符串
【发布时间】:2020-02-08 13:05:31
【问题描述】:

如果用户输入无效,我希望我的程序只接受字符串并提示消息。

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  :

那么我该如何解决这个问题? 是否有另一种方法来验证字符串输入?请保持简单,我只是一个初学者谢谢

【问题讨论】:

  • 你能展示整个Java类吗?
  • 对不起,我编辑了它
  • 您能否更具体地说明具体您在哪里遇到错误?输入是什么,你得到了什么错误?
  • 您似乎想要创建多个乘客,而不仅仅是一个。所以你肯定需要多个lastNamefirstName。所以创建一个类Passenger,它有一个名字和一个姓氏。然后使用List&lt;Passenger&gt; 并在外循环的每次迭代中创建一个新的Passenger

标签: java string validation input


【解决方案1】:

因为Scanner.nextInt 方法不会读取您输入中的换行符, 你需要消费nextInt之后的行:

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

这将解决似乎已经有输入的问题。

详情请见this

【讨论】:

    【解决方案2】:

    您可以使用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.printlnSystem.out.print 以某种方式仅在跟随 input.nextLine() 读取完成后打印(System.out.flush 在打印后立即不起作用),因此您似乎在输入开始时按下 Enter 按钮,并且该空行由 @987654329 读取@。此外,我在读取passenger 计数后立即添加了input.nextLine() 行,因此Scanner 在读取该数字后转到下一行。

    【讨论】:

      【解决方案3】:

      由于多次使用同一个扫描仪,扫描仪似乎出现问题。 尝试以如下方式使用扫描仪:

      public String getInput () {
      
      Scanner sc = new Scanner(System.in);
      return sc.nextLine(); 
      }
      

      然后使用

      firstname = getInput();
      

      【讨论】:

        【解决方案4】:

        您似乎想要创建多个乘客,而不仅仅是一个。所以你肯定需要多个lastNamefirstName。所以创建一个类Passenger,它有一个名字和一个姓氏。然后使用List&lt;Passenger&gt; 并在外循环的每次迭代中创建一个新的Passenger

        所以你应该有这个:

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

        现在在您的main 中,您需要一个List&lt;Passenger&gt;

        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());
        }
        

        最后将其放入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-class 需要一个构造函数,它接受三个String-args。此外,您永远不应该像我上面所做的那样公开公共字段,而应该使用公共 get 方法。所以你的类应该是这样的:

        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; }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-10
          • 1970-01-01
          • 1970-01-01
          • 2018-08-18
          相关资源
          最近更新 更多