Java Scanner:连续循环

时间:2014-04-24 02:04:40

标签: java java.util.scanner

当我输入任何有效选项(A,B,C)时,if语句认为该选项不是A,B或C,而是会导致连续循环。

package other;

import java.util.Scanner;

public class Menu implements InterfaceMenu{

private String option;

public void greeting(){

    System.out.println("This program will use the Pythagorean Theorem");
    System.out.println("to calculate a missing side.\n");
    System.out.println("Choose an option!\n");
    System.out.println("Choose Option A for missing side c");
    System.out.println("Choose Option B for missing side b");
    System.out.println("Choose Option C for missing side a\n");

}

public String optionGet(){

    System.out.print("Choose an option: ");
    Scanner ad = new Scanner(System.in);
    option=ad.next().toUpperCase();

    if( (option=="A") || (option=="B") || (option=="C") ){
        ad.close();
    }
    else{
        optionGet();
    }

    return option;
}

}

4 个答案:

答案 0 :(得分:3)

除了使用错误的方法来比较字符串之外,还有另一个严重的问题:optionGet()Scanner上打开一个新的system.in。如果输入包含不是A,B或C的选项,则optionGet()将自己递归调用。递归调用执行另一个

Scanner ad = new Scanner(System.in);

,而第一个仍然是。没有人知道它会做什么,但它可能会导致问题。不要那样做。不要使用递归。这里不合适。相反,将用于检查选项的代码放在循环中,并确保new Scanner在循环之外。

答案 1 :(得分:0)

使用String.equals()方法。不是==比较器。 .equals()检查字符串之间的相等性,==检查引用是否相同,这不是您想要做的事情。

答案 2 :(得分:0)

使用option.equalsIgnoreCase("A")代替==。因为==比较参考变量,等于比较内容。

答案 3 :(得分:0)

在Java字符串中,无法使用==标识符进行比较,方法与整数相同。相反,您可以使用String.equals()

对于您所写的内容,但最好比较字符,但需要将optionGet()中的返回变量类型更改为public char optionGet()。但是,执行此操作还需要您将option的类型更改为char。将类型更改为char将允许您使用==比较字符。

另外请务必在Scanner ad之外定义optionGet(),因为您当前的代码正在为每次重复重新定义。

您对自己的想法更容易。