我最近开始阅读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);
}
}
答案 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
块中。一旦你这样做,你的循环将通过阅读你的下一个实际输入正常工作。