我有一个家庭作业,需要用户输入并将其存储在各种数据结构(链表,堆栈等数组)中。但是,我一直以类似的方式撰写我以前的家庭作业的主要类别,而这一类作业也是。我有一个非常微小的主要方法。所有主要方法都是实例化一个新的对象,我不想被销毁,然后循环遍历该程序,直到用户选择其他方式。然后我有一个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();
}
}
由于这是全部文本输入,因此您需要假设/指示用户在一行中输入相关数据并在每次输入一些数据时读取整行。目前,你的程序有'next()'和'nextLine()'的组合。 – nhahtdh
这样做。我从来没有真正看到两者之间的区别,我猜。谢谢 – audiFanatic