我知道在StackOverflow上已经多次询问过这个问题,但是我尝试了很多不同的解决方案,而且没有一个能够解决问题。所以我决定向社区询问该怎么做。以下是我的代码中的相关代码段。
public class Calculator
{
public static void main(String[]args)
{
ArrayList<String> inputStorage = new ArrayList<String>();
Scanner input = new Scanner(System.in);
String rawInput;
boolean mainLoop = true;
String exitInput;
String mainMenuInput;
while(mainLoop == true)
{
mainMenuInput = input.nextLine()
switch(mainMenuInput)
{
case "Expression":
System.out.println("Type an expression");
while(input.hasNext)
{
rawInput = input.next();
inputStorage.add(rawInput);
}
break;
case "Equation":
System.out.println("Type an equation");
while(input.hasNext)
{
rawInput = input.next();
inputStorage.add(rawInput);
}
break;
case "exit":
System.out.println("Are you sure you want to exit")
exitInput = input.nextLine();
switch(exitInput)
{
case "yes":
case "Yes":
mainLoop = false;
case "no":
case "No":
break;
default:
System.out.println("That was not an option")
break;
}
default:
System.out.println("That was not an option");
break;
}
}
请注意,这只是我的代码的一部分,它从控制台输入,不包含任何其他内容。我有其他设置要求代码采用这种格式。
以下列出了我尝试过但没有效果的内容:
以下列出了对我的其余代码不起作用的内容:
话虽如此,我已经看到了一种方法,通过根据字符newLine的ASKII值创建退出条件。唯一的问题是我发现没有很好的方法将字符的ASKII值实现到java代码中(或者至少没有一个可以用于我的代码),为了实现它,我需要知道Scanner类如何使用下一行字符。但这只是一个建议的解决方案,我确信有人有更好的方法在按下enter时结束这样的输入循环。
感谢您的时间。
答案 0 :(得分:8)
最后你永远不会将mainLoop设置为false。您实际上并不需要嵌套while循环,只需要包含hasNext
答案 1 :(得分:0)
由于您的Scanner
正在处理已打开的流(System.in
),因此无法确定此流未处于创建和发送更多数据的过程中,这意味着它无法返回虚假,直到
因为那个
while(input.hasNext()){
...
}
是个糟糕的主意,因为在您获得正确的数据(或strim将被关闭)之前,您被hasNext()
阻止。
正确的解决方案取决于您的方案。如果您知道要阅读的数字,请使用
for (int i = 0; i < N; i++){
...
rawInput = input.next();
...
}
在您只想从一行处理令牌的场景中,您可以先读取该行,然后使用单独的扫描仪对其进行标记
Scanner lineScanner = new Scanner(input.nextLine());
while(lineScanner.hasNext()){
rawInput = lineScanner.next();
inputStorage.add(rawInput);
}
答案 2 :(得分:0)
如果它应该使用读取行,你可以试试这个:
ctime