Java While Loop打破了负面

时间:2014-03-03 17:17:42

标签: java loops while-loop

我正在解决这个我正在为明天工作的java项目。我应该做一个while循环,提示用户输入商品的价格,并以任何负数结束循环,不能计算负数。然后我必须分别使用变量3,2,1,0提示用户他们的会员折扣等级15%折扣/金7%/银3%/非会员0%折扣。对于无效的成员资格状态输入,用户需要使用do-while循环再次输入有效成员资格。然后我使用相应的折扣%off项目的总和,然后征税。最后几步很简单,但我陷入了循环。

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

我修改它以满足我的需要但我仍然找不到使throwable =任何负数的方法,即< 0。这甚至可能吗?我很确定有一种方法可以在没有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:") ;
    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并用else替换catch throwable(askPrice< 0),但是我遇到了大量错误。

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

6 个答案:

答案 0 :(得分:2)

这听起来像是家庭作业。我知道很多老师都反对学生使用'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();
    }
}

答案 1 :(得分:1)

这是一个简单的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循环vs while循环。在分析循环条件之前,do-while循环将始终运行一次。这允许您接受循环内的用户输入并保持代码清洁。我相信在可能的情况下避免使用break语句是一种好习惯。它通常会阻止您编写错误的代码(当然,除了switch语句之外)。

编辑:对于记录,我认为try catch语句不仅是必需的,而且对于任何用户输入都是必需的。当用户输入无效数字时,您是否需要抛出堆栈跟踪或您的程序正常处理错误输入并通知用户的错误错误。最重要的是它让新程序员思考错误处理,这是软件开发的一个非常重要的部分。

答案 2 :(得分:1)

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 :(得分:0)

你不检查负数。

您需要将最后一个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());

答案 4 :(得分:0)

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

    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());

有些观点:

  • 尝试/捕获总是在一个循环之外,使代码更具可读性和更快
  • 在catch内,你必须放一个syserr,而不是sysout
  • 在原始代码中,当用户放入一个美元字符时,永久lopp完成,在指令转换为数字时抛出异常

    askPrice.nextDouble()

在您的情况下,说明

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

不要使用负数抛出任何异常。

答案 5 :(得分:0)

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

您可以在获得价格后抛出异常来临时修复代码:

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

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