2017-08-09 97 views
0

我是新来的java,并有以下问题。我已经发现一对夫妇对这个答案的,但仍然很不清楚如何执行而块来解决这个问题:重试在try-catch中的尝试块在java

在下面的代码,我想收到有关“产品名称”和“价格信息'来自用户输入。产品名称是使用scanner.next()函数检索的字符串,价格是双倍。如果用户提供的产品名称与使用空格不正确相同,则会在catch块中捕获扫描器类引发错误。 问题是我该如何返回到try块并为用户提供第二次输入产品名称值而不是退出系统的机会?我在这个问题上做了很多搜索,但仍然没有找到解决方案。

String[] sArrProdName = new String[newUser.getNumberOfItemsInStock()] ; 
    double[] sArrPrice = new double[newUser.getNumberOfItemsInStock()]; 

    for(int i=0;i<newUser.getNumberOfItemsInStock();i++) 
    { 
     try { 

     System.out.println("Enter product Name: "); 
     sArrProdName[i]= s.next(); 
     System.out.println("Price? : "); 
     sArrPrice[i] = s.nextDouble(); 

     } 
     catch (InputMismatchException e) { 

      prompt("Enter product name correctly"); 

     } 
    } 
+0

你有使用'break'声明试图用一个无限循环(或有限的循环)在'try'块?或者在'try'块中设置为true的布尔型循环?你应该可以自己做这些提示 – Dici

+0

欢迎来到Stack Overflow!请查看我们的[SO问题清单](http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist)来帮助你提出一个好问题,从而得到一个很好的答案。 –

+0

如果你在一个函数下使用这个函数,比在函数中抛出InputMismatchException e更好,并且在for循环中调用这个方法的地方捕获它。 –

回答

0

我只是写这件事上的苍蝇,但安装会是这个样子:

String[] sArrProdName = new String[newUser.getNumberOfItemsInStock()] ; 
    double[] sArrPrice = new double[newUser.getNumberOfItemsInStock()]; 

    for(int i=0;i<newUser.getNumberOfItemsInStock();i++) 
    { 
     boolean retryInput = true; 

     while (retryInput) 
     { 
      try { 

      System.out.println("Enter product Name: "); 
      sArrProdName[i]= s.next(); 
      System.out.println("Price? : "); 
      sArrPrice[i] = s.nextDouble(); 
      retryInput = false; 
      } 
      catch (InputMismatchException e) { 

       prompt("Enter product name correctly"); 

      } 
     } 
    } 

这里的基本前提是,try块可以被认为是其自身的自我包含if声明 - if正在尝试的任务已完成,请执行该块的其余部分。因此,一个简单的布尔标志可以被设置为只有在代码被验证后才会改变。

当然,在retryInput = false;本身之前,您会希望进行检查;这是只有那里作为示例来更改布尔标志。

编辑:向Dici Shoutout,他们的评论是正确的。

+1

和其他答案一样的意见 – Dici

+0

非常感谢你的回答。我的最终代码工作 – Mona

0

像这样的东西可以工作:

class ProductInfo{ 
    public static final int NUM_RETRY = 3; 

    public static void main(String[] args) { 
     String[] sArrProdName = new String[newUser.getNumberOfItemsInStock()] ; 
     double[] sArrPrice = new double[newUser.getNumberOfItemsInStock()]; 
     int cont; 
     for(int i=0;i<newUser.getNumberOfItemsInStock();i++){ 
      cont = 0; 
      while (cont<=NUM_RETRY){ 
       try { 
        System.out.println("Enter product Name: "); 
        sArrProdName[i]= s.next(); 
        System.out.println("Price? : "); 
        sArrPrice[i] = s.nextDouble(); 
       }catch (InputMismatchException e) { 
        cont++; 
        prompt("Enter product name correctly"); 

       } 
      } 
     } 

    } 
} 
+0

用户体验改进:最后一次失败应明确表示无法重试,而不是输出正确输入产品名称,然后退出程序。您也可以在第一次失败后显示剩余的重试次数 – Dici

+0

这绝对有效。 Scotts解决方案也可以正常工作。我的下一个问题是产品名称被跳过,我得到的输出直接输入价格: – Mona

+0

有没有办法清除扫描缓冲区,以便在下次试用时不会丢失剩余的输入。就像在这种情况下,如果导致失败的先行用户输入是'ab an',那么scanner.next()似乎在内部将'an'用于下一次尝试并跳过输入产品名称:输出 – Mona