0

我有一个家庭作业,需要用户输入并将其存储在各种数据结构(链表数组、堆栈等)中。但是,我一直在以非常相似的方式写我以前的家庭作业的主要课程和这一个。我有一个非常小的主要方法。所有主要方法都是实例化一个我不想被破坏的新对象,然后永远循环通过程序,直到用户选择其他方法。然后我有一个menu()打印选择列表并读取用户选择的方法。然后从那里,我将该选择传递给另一个方法,该方法解释选择并相应地执行。

我在过去的作业中一直遇到的问题,现在我从来没有真正得到一个好的答案。问题似乎在于我的menu()方法,更具体地说,在于Scanner对象。nextLine()在我在扫描仪对象上调用该方法后,似乎总是在流中留下一些垃圾。因此,下次menu()调用该方法时,它会读入该垃圾并循环使用该垃圾的程序的其余部分,直到menu()第三次调用该方法。过去,我会通过next()在收到输入后立即调用该方法并忽略它来解决此问题。但是,我现在似乎也遇到了问题。

特别是在这个程序中,我有一个请求用户输入城市名称的方法。现在,城市名称可以是多个单词(棕榈城、西棕榈滩、卫星海滩、纽约等)。现在,当扫描器读取其中一个多字城市时,它会执行与以前相同的操作,在下一次menu()调用该方法时读取一些垃圾,并使用它遍历整个程序,直到menu()再次调用。在这种情况下,它会打印一个字符串“Invalid Selection”,然后再次打印菜单。我一生都无法弄清楚发生了什么。任何帮助,将不胜感激。

import java.util.Scanner;


public class CSAir
{
    public static Scanner input = new Scanner(System.in);

    public static void main(String[] args)
    {
        CityList flightLog = new CityList();
        boolean loop = true;

        while(loop)
        {
            loop = actions(menu(),flightLog);
        }

    }

    private static String menu()
    {
        System.out.print("Please Make a Selection\n" +
            "I) Insert a city\n" +
            "A)Add a flight path (One Way)\n" +
            "R) Request a flight\n" +
            "L) Load from a text file\n" +
            "Q) Quit\n" +
            "\nSelection: ");

        String in = input.next();
        //input.next();
        System.out.println();
        return in;
    }

    private static boolean actions(String selection, CityList flightLog)
    {
        if(selection.equalsIgnoreCase("I"))
        {
            insert(flightLog);
            return true;
        }

        else if(selection.equalsIgnoreCase("A"))
        {
            add(flightLog);
            return true;
        }

        else if(selection.equalsIgnoreCase("R"))
        {
            request(flightLog);
            return true;
        }

        else if(selection.equalsIgnoreCase("L"))
        {
            return true;
        }

        else if(selection.equalsIgnoreCase("Q")) return false;

        else 
        {
            System.out.println("Invalid Selection!\n");
            return true;
        }
    }

    private static void request(CityList flightLog)
    {
        System.out.print("Origin: ");
        String origin = input.nextLine();
        System.out.print("\nDestination: ");
        try
        {
            flightLog.isPath(origin, input.next());
        }
        catch (AllDestinationsVisitedException e)
        {
            e.getMessage();
        }
    }

    private static void add(CityList flightLog)
    {
        System.out.print("Origin: ");
        String origin = input.nextLine();
        System.out.print("\nDestination: ");
        flightLog.addPath(origin, input.next());
    }

    private static void insert(CityList flightLog)
    {
        System.out.print("Enter a City: ");

        try
        {
            flightLog.addCity(input.next());
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        System.out.println();
    }

}
4

1 回答 1

0

扫描仪的默认分隔符是white space. 因此,当您输入时,New York因为它white space现在具有扫描仪,如果您调用next().

更好的选择是使用nextLine()方法来读取这些值。

于 2012-10-06T03:58:25.823 回答