2016-05-15 45 views
1

首先感谢您在堆栈溢出时所做的一切。它帮了我很多次! 今天我的问题是使用try/catch指令和扫描器一起使用的一个小问题。看看我的方法添加到产品配方:Java扫描器尝试捕获多种数据类型

public static void addProducts(List<Product> product, Scanner sc) 
{ 
    if (run == true) 
    { 
     Maths calc = new Maths(); 
     //Some instructions in Polish, not needed here :) 
     while (true) 
     { 
      String name = null; 
      double quantity = 0; 
      double pricePerUnit = 0; 
      try 
      { 
       name = sc.nextLine(); 
       if (name.equals("0") || name.equals("exit")) 
       { 
        Logic.run = false; 
        break; 
       } 
       quantity = sc.nextDouble(); 
       sc.nextLine(); 
       pricePerUnit = sc.nextDouble(); 
       sc.nextLine(); 

       product.add(new Product(product.size() + 1, name, calc.round(quantity, 2), calc.round(pricePerUnit, 2))); 
       System.out.println("Product added: " + "\n" + product.get(product.size() - 1)); 
      } catch (InputMismatchException e) 
      { 
       System.out.println("Error! Please repeat your last input."); 
      } 
     } 
     double num = 0; 
     for (Product p : product) 
     { 
      num += p.getPrice(); 
     } 
     Maths.setTotalPrice(num); 
     System.out.println("Total: " + num); 

    } else 
    { 
     System.out.println("You have already added products to the recipe!"); 
    } 
} 

正如你可以看到即时阅读的字符串,双和双在try/catch语句指令。例如,在食谱中添加“土豆”时,我意外地在数量应该写的“马”上写下名为“马”的产品,而不是“土豆”。明白了吗?我在这里有一只黄色的鸭子,但用我的母语比在英语中更容易解释:) 如果有什么不清楚的地方,我会尽我所能解释,谢谢!

+0

您可以使用'if(run)'而不是'if(run == true)'。 – dorukayhan

+0

只需确认:您的输入是每行3行?名称,数量,价格? – Bohemian

+1

您是否收到错误?什么不起作用? – sebenalern

回答

1

当你这样做:

quantity = sc.nextDouble(); 
sc.nextLine(); 

你把自己的任何额外的输入,无需确认。如果你想限制用户只能输入一个数字,并没有别的一条线,使用:

quantity = Double.parseDouble(sc.nextLine()); // maybe add .trim() 

如果你把你的代码保持不变,请记住,当InputMismatchException被抛出,Scanner仍然坐在(在开始)的不良输入,所以你需要丢弃:

} catch (InputMismatchException e) 
{ 
    System.out.println("Error! Please repeat your last input."); 
    sc.nextLine(); // discard bad input 
} 

当然,你的代码将循环并提示所有3个输入,这样的错误信息是有点误导。

+0

当使用Double.parseDouble时,我不得不改变catch(InputMismatchException e)来捕获(java.lang.NumberFormatException e),但我的问题仍然存在。当我在输入数量时发现错误时,我放弃了作为名称给出的内容。我明白做到这一点的唯一方法是告诉用户重复整个产品。是对的吗?或者我应该为每个输入的数据制动一个尝试/抓鱼? – Kreick

+0

不,你不必重新开始。而不是一个单一的循环,回到开始,创建3个循环,每个值一个。 [干](https://en.wikipedia.org/wiki/Don't_repeat_yourself):一个好的帮手方法可能是好的,以减少重复的代码。 – Andreas