我在Java中使用while循环有什么问题

时间:2014-08-11 17:17:43

标签: java do-while

我正在编写这个程序,并且不理解为什么循环不会退出并输出System.out.print()。有人可以看看它并告诉我发生了什么事吗?

public class SalesTax 
{

    public static void main(String[] args) 
    {   
        // Input items for shopping cart
        HashMap<String, Double> cart = new HashMap<String, Double>();

        // Create a Scanner
        Scanner input = new Scanner(System.in).useLocale(Locale.US);

        //variables
        String item;
        double price;
        boolean done = false;
        String ans;
        do
        {       
            System.out.print("Enter the item then select enter followed by the price and enter.");
            item = input.nextLine();
            price = input.nextDouble();
            cart.put(item, price);
            System.out.print("If done type done if not continue with adding to cart.");
            ans = input.nextLine();

            if(ans.equals("Done"))
                done = true;
            else
                item = input.nextLine();
                price = input.nextDouble();
                cart.put(item, price);
                System.out.print("If done type done if not continue with adding to cart.");
        } while( !done);

        System.out.print("Yo");
    }
}

3 个答案:

答案 0 :(得分:4)

问题是else块周围没有花括号:尽管你已正确缩进块,但缩进并不重要:只有第一行

item = input.nextLine();

被视为else的一部分;其余的是无条件执行。

请注意,只有一个地方可以将done设置为true,您可以使用&#34; forever&#34替换do / while循环;循环,并使用break退出中间的循环:

while (true) {
    ...
    if (ans.equals("Done")) {
        break;
    }
    ...
}

这使得声明done变量不必要。

答案 1 :(得分:1)

除了缺少大括号外,您的程序还会显示键入done的说明,但程序实际上会检查Doneequals方法要求字母大小写完全相同。因此,如果您按照说明操作,可能会显示您的循环永不退出。

这是解决该问题的一种方法:

if(ans.equalsIgnoreCase("Done"))

答案 2 :(得分:0)

public static void main(String[] args) 
{   
    //Input items for shopping cart
    HashMap<String, Double> cart = new HashMap<String, Double>();

//Create a Scanner
Scanner input = new Scanner(System.in).useLocale(Locale.US);

//variables
String item = "";
double price;
boolean done = false;
String ans = ""; //Initialize to empty, just my common practice.
do
{       
    System.out.print("Enter the item then select enter followed by the price and enter.");
     item = input.nextLine();
     price = input.nextDouble();
    cart.put(item, price);
    System.out.print("If done type done if not continue with adding to cart.");
    ans = input.nextLine();

    if(ans.toLowerCase.equals("done")) //to handle upper and lower case
    {
        done = true;
    }
    else
    { //Add curly braces*************
        item = input.nextLine();
        price = input.nextDouble();
        cart.put(item, price);
        System.out.print("If done type done if not continue with adding to cart.");
    }
}while(!done);

System.out.print("Yo");

}

基本上你需要做的就是闭上牙箍。此外,您可以通过将第一组.next ----()移动到do语句之上,然后让else语句处理.next ---()

来使模块更加模块化。