【问题标题】:Java While Loop breaking with a negativeJava While 循环以负数中断
【发布时间】:2014-03-03 17:17:41
【问题描述】:

我明天要处理的这个 java 项目有问题。我应该做一个 while 循环,提示用户输入项目的价格,并以任何负数结束循环,该负数不能被计算在内。然后我必须分别使用变量 3,2,1,0 提示用户他们的会员折扣级别 plat 15% off/gold 7%/silver 3%/non member 0% off。对于成员状态的无效输入,用户需要使用do-while循环再次输入有效的状态。然后我使用项目总和的适当折扣%,然后对其征税。最后几个步骤很简单,但我陷入了困境。

我进行了一些搜索,并在这个站点上找到了这个代码块,它完成了第一个 while 循环的工作,但没有以我需要的方式结束。 Using While Loop instead of a For Loop in Java to ask User Input

我对其进行了修改以满足我的需要,但我仍然无法找到将 throwable = 设置为任何负数的方法,即

Scanner askPrice = new Scanner(System.in);
BigDecimal totalPrice = new BigDecimal("0");
Scanner keyboard = new Scanner(System.in);
while (true) {
    System.out.println("Enter item price or negative number to quit:") ;
    try {
        double price = askPrice.nextDouble();
        totalPrice = totalPrice.add(new BigDecimal(String.valueOf(price)));
    }
    catch (Throwable t) {
        break;
    }
    System.out.println(totalPrice.toString());
}

我尝试将 try 和 catch 语句转换为 if / else 并将 catch throwable 替换为 else(askPrice

我非常感谢可以提供的任何帮助。 谢谢。

【问题讨论】:

  • 是的,有一种方法不需要 try/catch。 break 会将自己从 while 循环中删除,所以你是正确的。尝试做一个简单的if 语句来检查price 的值,以及是否需要break
  • 不要使用 try/catch -- 完全没有必要。 if (price < 0.0) break; 就是你所需要的。
  • 另一件事要说,不要抓住Throwable,而是你的特定Exception,你应该总是处理它,例如打印堆栈跟踪以了解导致错误的原因。
  • 谢谢,所有的答案都非常有帮助,我希望我可以勾选每个人。
  • askPriceScanner!你不能像else(askPrice <0) 那样比较它!你必须像price < 0那样比较它

标签: java loops while-loop


【解决方案1】:

这听起来像是家庭作业。我知道很多老师反对学生使用“break”来退出循环。这是我将如何做到的。 try-catch 语句是不必要的。

public static void main(String[]args) {

Scanner keyboard = new Scanner(System.in);
    double input = 0.0;
    double totalPrice = 0.0;

    do {
        totalPrice += input;
        input = keyboard.nextDouble();
    }

    while(input >= 0);
}

使用while循环:

public static void main(String[]args) {

Scanner keyboard = new Scanner(System.in);
    double totalPrice = 0.0;
    double input = keyboard.nextDouble();

    while(input >= 0) {
    totalPrice += input;
    input = keyboard.nextDouble();
    }
}

【讨论】:

  • 谢谢,这真的很有帮助。所有的 try/catch 和字符串都让我感到困惑,将其简化为简单的双精度和循环很棒。您如何将您的工作时间转换为只是时间?
  • 我更新了答案以包含一个 while 循环版本。我建议你使用一段时间。它更简单。
  • 感谢添加while版本,不胜感激。这是我的第一堂编程课,对我来说很容易迷路。
  • 我知道它是什么样的。我也是一名编程学生。 :-)
【解决方案2】:

Try/catch 是用来处理异常的,这里完全没有必要。

    Scanner askPrice = new Scanner(System.in);
    BigDecimal totalPrice = new BigDecimal("0");
    Scanner keyboard = new Scanner(System.in);

    while (true) {

        System.out.println("Enter item price or negative number to quit:") ;
        double price = askPrice.nextDouble(); 
        if (price<0)
            break;
        else {
            totalPrice = totalPrice.add(new BigDecimal(String.valueOf(price)));       
        }
        System.out.println(totalPrice.toString());
   } 

【讨论】:

    【解决方案3】:

    这是您正在寻找的一个简单的 do while 循环

    double price = 0;
    do {
        try {
            price = askPrice.nextDouble();
            // if the price was  > 0 we need to add it to the total
            if(price > 0)
                totalPrice = totalPrice.add(new BigDecimal(String.valueOf(price)));  
        } catch(InputMismatchException e) {
            // exit our loop, if the user entered an invalid double. Maybe you want to display a message instead?
            price = -1; 
        }
    } while(price >= 0);
    

    关键是 do-while 循环与 while 循环。 do-while 循环总是在分析循环条件之前运行一次。这允许您在循环内接受用户输入并保持代码干净。我相信尽可能避免使用break 语句是一种好习惯。它通常可以防止你编写糟糕的代码(当然 switch 语句除外)。

    编辑: 作为记录,我认为 try catch 语句不仅是必要的,而且对于任何用户输入都是强制性的。当用户输入无效数字时,您是否希望引发堆栈跟踪的严重错误,或者您的程序可以优雅地处理错误输入并通知用户。最重要的是,它让新程序员开始思考错误处理,这是软件开发中非常重要的一部分。

    【讨论】:

      【解决方案4】:

      你不检查负数。

      您需要将最后一个 System.out 移出循环

          Scanner askPrice = new Scanner(System.in);
          BigDecimal totalPrice = new BigDecimal("0");
      
          while (true) {
      
              System.out.println("Enter item price or negative number to quit:");
              try {
                  double price = askPrice.nextDouble();
                  if (price < 0)
                      break;
      
                  totalPrice = totalPrice.add(new BigDecimal(String.valueOf(price)));
              } catch (Throwable t) {
                  break;
              }
          }
          System.out.println(totalPrice.toString());
      

      【讨论】:

        【解决方案5】:

        我不确定是否理解,但如果您想以负数作为输入退出,请使用:

            Scanner askPrice = new Scanner(System.in);
            BigDecimal totalPrice = new BigDecimal("0");
            Scanner keyboard = new Scanner(System.in);
            double price = 0.0d;
            try {
                while (0.0d <= price) {
                 System.out.println("Enter item price or negative number to quit:") ;
                 price = askPrice.nextDouble();        
                 totalPrice = totalPrice.add(new BigDecimal(String.valueOf(price)));       
                }
             }catch (Throwable t) {           
                System.err.println(t.getMessage());         
             }
             System.out.println(totalPrice.toString());
        

        几点:

        • try/catch 总是超出一个循环,因为代码更具可读性和更快
        • 在 catch 里面,你必须放一个 syserr,而不是 sysout
        • 在原始代码中,当用户输入一个美元字符时,永恒的 lopp 完成,在使用指令转换为数字时会引发异常

          askPrice.nextDouble()

        在你的情况下,说明

         double price = askPrice.nextDouble();        
         totalPrice = totalPrice.add(new BigDecimal(String.valueOf(price))); 
        

        不要抛出任何带有负数的异常。

        【讨论】:

          【解决方案6】:

          通常最好编写自己的代码而不是复制简单示例的代码。这样你会学到很多东西。在代码中,while 循环缺少右大括号,我希望稍后有大括号关闭。

          你可以在得到价格后通过抛出异常来临时修复代码:

          double price = askPrice.nextDouble();
          if(price < 0) throw new ArithmeticException("Negative Price!");
          

          我不确定这是否是你想要的。

          【讨论】:

            猜你喜欢
            • 2019-02-01
            • 1970-01-01
            • 2017-11-14
            • 2019-05-05
            • 1970-01-01
            • 2014-03-29
            • 1970-01-01
            • 2016-12-03
            • 2016-07-24
            相关资源
            最近更新 更多