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()
。这就完成了。我从来没有真正研究过两者之间的区别。谢谢