尝试/捕捉跳过循环?

时间:2015-02-22 13:20:26

标签: java

我最近开始阅读try / catch并在一定程度上理解它们,所以我想我试一试。

我正在编写的程序要求你输入一个double并将它存储在一个数组中,但如果输入不是double,则表示'请输入一个double'但是如果您不多次输入一个双精度数,那么程序将终止,并将所有输入的双精度值相加。

如果我输入我们只需说" fdsaf"在那我得到

  

请输入双重

     

请输入双倍

     

请输入双重

     

0.0

包task4;

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;

public class DataReader {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ArrayList<Double> fPoint = new ArrayList<Double>();
        double holder = 0;

        Scanner in = new Scanner(System.in);
        int i = 0;

        while(i < 2){
            try{
                System.out.println("Please input an double");

                double temp = in.nextDouble();      
                fPoint.add(temp);

            }catch( InputMismatchException e){
                System.out.println("Please input a double");
                i++;
            }
        }

        for(int j = 0; j < fPoint.size(); j++){
            holder +=  fPoint.get(j);
        }
        System.out.println(holder);
    }

}

2 个答案:

答案 0 :(得分:0)

您的程序对Scanner API的使用已被破坏。请仔细阅读其文档。我将指出一个重要的句子:

  

当扫描程序抛出InputMismatchException时,扫描程序将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过它。

在这种情况下你所做的只是再次调用相同的方法,导致无限循环。通常,您需要致电

in.nextLine();

在catch-block内。

答案 1 :(得分:0)

问题不在于try...catch,而在于Scanner的工作方式。

Scanner保持在&#34;展望未来&#34;缓冲区,允许它使用hasNextInt()hasNextDouble()等方法

当调用其中一个方法(如nextDouble())时,它会从其源(System.in)中读取输入,在这种情况下,将其输入到#34;向前看&#34;缓冲区,并检查它是否与用户要求的内容兼容。如果不是,则输入保留在缓冲区中,Scanner抛出异常。 (如果方法是hasNextDouble(),那么它不会抛出异常,只返回false。

这在某些情况下会有所帮助。例如,如果程序员想先尝试查看输入中的下一个项目是否为int,那么如果它不是,那么看它是否是双重的,如果不是,则查看它是否为& #39;一个匹配某个模式的字符串 - 程序员可以这样做,因为数据仍在该缓冲区中等待,并且在被任何nextXXX()方法正确读取之前不会被丢弃。

但是这种行为会导致程序失败,因为你期望双重消失,所以你希望程序读取下一个输入。但它没有,因为你没有摆脱旧的输入,它仍然在缓冲区等待。

每次拨打nextDouble()时,它会查看此缓冲区,该缓冲区未发生变化,并且发现它的仍然不是双倍的,并且它保持不变它在那里再次抛出异常。尽管您只尝试了一个输入项,但i增加了2并退出了程序。

因此,正如您所说,在重试之前,您需要清除缓冲区。为此,您可以使用nextLine()。因为它不期望任何特定的输入并且会接受任何东西,它肯定会从缓冲区中删除那个错误的输入。事实上,它将删除所有内容,直到输入行结束。

将它放在catch块中。一旦你这样做,你的循环将通过阅读你的下一个实际输入正常工作。