Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扫描器循环头痛_Java_Loops_Input_Io - Fatal编程技术网

Java 扫描器循环头痛

Java 扫描器循环头痛,java,loops,input,io,Java,Loops,Input,Io,我有一个家庭作业,需要用户输入并存储在各种数据结构(链表数组、堆栈等)中。然而,我以前的家庭作业和这堂课都是以类似的方式写的。我有一个非常小的主要方法。主要方法所做的就是实例化一个我不想被破坏的新对象,然后在程序中永远循环,直到用户选择其他方法。然后我有一个菜单()方法,它打印一个选择列表并读取用户的选择。然后从那里,我将选择传递给另一个方法,该方法解释选择并相应地执行 我在过去的作业中遇到的问题,现在我从来没有得到一个好的答案。问题似乎出在我的菜单()方法上,更具体地说,是扫描仪对象。在我调用

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

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

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

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

}

扫描仪的默认清除器为
空白
。因此,当您输入纽约时,由于它有空格,所以如果您调用
next()
,扫描仪会将其视为两个令牌


更好的选择是使用读取此类值的方法。

由于这是所有文本输入,您需要假设/指示用户在一行中输入相关数据,并在每次输入某些数据时读取整行数据。目前,您的程序混合了
next()
nextLine()
。这就完成了。我从来没有真正研究过两者之间的区别。谢谢