java - 在 Java 中,我应该为不同类型的输入使用不同的 Scanner 实例吗?

标签 java input types java.util.scanner

我需要获得用户的输入。他们开始创造一朵新花。用户告诉我花的名称 (String)、花的颜色 (String)、花上的刺数 (int) 和花的气味 (String)。我使用一个名为 input 的 Scanner 来获取所有这些。但是,它无法正常工作。得到刺的数量后,程序会询问用户这朵花闻起来像什么,但不会让我输入答案。但是,我创建了第二个名为 input2 的 Scanner 来获取荆棘的数量,现在它可以正常工作了。这是代码:

import java.util.Scanner;
import java.util.ArrayList;

public class AssignmentTwo {

    static ArrayList<FlowerClass> flowerPack = new ArrayList<FlowerClass>();


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

        while(true){
            System.out.println("1. Add flower to flowerpack.");
            System.out.println("2. Remove flower from the flowerpack.");
            System.out.println("3. Search for a flower in the flowerpack.");
            System.out.println("4. Display the flowers in the flowerpack.");

            int userChoice = input.nextInt();

            switch(userChoice){
            case 1:
                addFlower();
                break;
            case 2:
                //removeFlower();
                break;
            case 3:
                //searchFlower();
                break;
            case 4:
                displayFlowers();
                break;
            case 5:
                System.out.println("Goodbye!");
                System.exit(0);
            }
        }
    }

    public static void addFlower(){
        Scanner input = new Scanner(System.in);
        System.out.println("What is the flower's name?");
        String desiredName = input.nextLine();
        System.out.println("What is the flower's color?");
        String desiredColor = input.nextLine();
        System.out.println("How many thorns does it have?");
        Scanner input2 = new Scanner(System.in);
        int desiredThorns = input2.nextInt();
        System.out.println("What does it smell like?");
        String desiredSmell = input.nextLine();
        flowerPack.add(new FlowerClass(desiredName, desiredColor, desiredThorns, desiredSmell));
    }

    public static void displayFlowers(){

        for (FlowerClass flower: flowerPack){
            System.out.println(flower.getName());
        }
        System.out.println("Number of flowers in pack: " + FlowerClass.numberFlowers());

    }
}

如果您查看我的 addFlower() 函数,您会看到我创建 Scanner input2 并使用 input2 获取新花的刺数的 int 的部分。之前,我使用函数中的第一个 Scanner 实例来获取荆棘数量的输入。但是,它无法正常工作。旧函数如下所示:

public static void addFlower(){
        Scanner input = new Scanner(System.in);
        System.out.println("What is the flower's name?");
        String desiredName = input.nextLine();
        System.out.println("What is the flower's color?");
        String desiredColor = input.nextLine();
        System.out.println("How many thorns does it have?");
        int desiredThorns = input.nextInt();
        System.out.println("What does it smell like?");
        String desiredSmell = input.nextLine();
        flowerPack.add(new FlowerClass(desiredName, desiredColor, desiredThorns, desiredSmell));
    }

第一个版本的功能不起作用的原因是什么?我设法通过使用新的扫描仪修复了它,但我不明白为什么第一个版本不起作用。当您尝试对不同类型的输入使用单个扫描仪时,扫描仪是否会感到困惑?我正在查看 Java 教程文档中的扫描教程,但没有看到答案。感谢您的宝贵时间!

最佳答案

我认为挂起是因为当你在 nextInt() 之后调用 nextLine() 时,nextInt() 中没有解析的换行被算作行尾,所以扫描器假设你是完成了。缓解这种情况的一种方法是始终调用 nextLine,但将生成的 String 解析为 Int。

我不认为在大多数情况下这样做是个好主意,但在您的情况下这似乎是有益的。

public static void addFlower(){
    Scanner input = new Scanner(System.in);
    ...
    int desiredThorns = Integer.parseInt(input.nextLine());
    ...
    flowerPack.add(new FlowerClass(desiredName, desiredColor, desiredThorns, desiredSmell));
}

关于java - 在 Java 中,我应该为不同类型的输入使用不同的 Scanner 实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24336626/

相关文章:

java - 具有部分限定命名空间的引用类型

java - E4 RCP 应用程序在双击事件时不响应

java - 动态设置 List<type>

javascript - jQuery:更改输入值不用于新添加

html - 将我的表单输入字段置于彼此之下

C++,模板 : get type of the item

haskell - 在类 Functor 的声明中,类型变量可以是函数类型吗?

java - 从 Nexus 部署 Artifact 的正确方法

java - Android studio 使用代码为按钮设置十六进制颜色值

javascript - jquery验证多个文本字段中的出生日期