Java 尝试/捕获跳过循环?

Java 尝试/捕获跳过循环?,java,Java,我最近开始阅读try/catch,并在一定程度上理解它们,所以我想我应该尝试一下 我正在编写的程序要求您输入一个double并将其存储在一个数组中,但如果输入不是double,则会显示“请输入double”,但如果您不止一次输入一个double,则程序将终止并将输入的所有double值相加 如果我输入,让我们只说“fdsaf”,然后我得到 请输入一个双精度 请输入一个双精度 请输入一个双精度 0.0 一揽子任务4 import java.util.ArrayList; import java.u

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

我正在编写的程序要求您输入一个double并将其存储在一个数组中,但如果输入不是double,则会显示“请输入double”,但如果您不止一次输入一个double,则程序将终止并将输入的所有double值相加

如果我输入,让我们只说“fdsaf”,然后我得到

请输入一个双精度

请输入一个双精度

请输入一个双精度

0.0

一揽子任务4

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

}
import java.util.ArrayList;
导入java.util.InputMismatchException;
导入java.util.Scanner;
公共类数据读取器{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
ArrayList fPoint=新的ArrayList();
双支架=0;
扫描仪输入=新扫描仪(系统输入);
int i=0;
而(i<2){
试一试{
System.out.println(“请输入双精度”);
双温=in.nextDouble();
F点添加(温度);
}捕获(输入不匹配异常e){
System.out.println(“请输入一个双精度”);
i++;
}
}
对于(int j=0;j
您的程序使用的
扫描仪
API已损坏。请仔细阅读其文档。我要指出一句关键的话:

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

在这种情况下,您所要做的就是再次调用相同的方法,从而产生一个无限循环。通常你会想打电话

in.nextLine();

在catch块中。

您的问题不在于
尝试…catch
,而在于
扫描仪的工作方式

Scanner
保留一个“向前看”缓冲区,允许它使用类似于
hasNextInt()
hasNextDouble()等方法

当调用它的一个方法(如
nextDouble()
)时,它会将其源(
System.in
)中的输入读入这个“前瞻”缓冲区,并检查它是否与用户要求的内容兼容。如果没有,输入将保留在缓冲区中,
扫描器
抛出异常。(如果方法是
hasNextDouble()
,那么它不会抛出异常,只返回false)

这在某些情况下很有帮助。例如,如果程序员想首先查看输入中的下一项是否为int,如果不是,则查看它是否为double,如果不是,则查看它是否为与某个模式匹配的字符串-程序员可以这样做,因为数据仍在该缓冲区中等待,在任何
nextXXX()
方法正确读取之前,不会将其丢弃

但是这种行为会使程序失败,因为您希望double消失,因此您希望程序读取下一个输入。但它没有,因为您没有摆脱旧的输入,它仍然在缓冲区中等待

每次调用
nextDouble()
,它都会查看这个缓冲区,这个缓冲区没有改变,它仍然不是一个double,它会将它保留在那里并再次抛出一个异常。您的
i
递增,您到达
2
并退出程序,尽管您只尝试了一个输入项

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


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

问题是什么?如果我输入'sdjgf',那么循环将不会在第二次循环,用户必须有第二次机会输入一个双@realpoint