此代码应该将所有值存储到称为分数的双精度数组中,稍后我将使用它。我得到一个例外。
import java.io.*;
import java.util.*;
public class readFile {
public static void main(String[] args)
throws IOException{
double [] scores = new double[40];
Scanner input = new Scanner(new File("scores.dat"));
while(input.hasNext()){
int i = 0;
scores[i] = input.nextDouble();
System.out.println(scores[i]);
i++;
}
}
}
这是输入。仅举例来说。
70 79 72 74 81 83 84 89.2 88.3 75.0 77 91.2 92.9 81.1 67.9 77 80 101 10%! @#77.5 89 99 -51 88.5 75.1 79 86 80 82.1 83.3 95.7 98.9 80.1 79.9 70.2 88 100 105 78.5 68.2 63.1 58.9 69.3 74.1 75.5 78.8 79.1 82.2 84.3 @#86.63 512345 99999999999999 3#@&& apple 99.5 93.1 95.5!@V 78.1.21 88 8
它停在第一个符号,但我只想跳过它并转到下一个符号。我错过了什么?
"线程中的异常" main"的 java.util.InputMismatchException "
答案 0 :(得分:0)
让我们看看InputMismatchException
的含义
public class InputMismatchException extends NoSuchElementException
由扫描程序抛出,表示检索到的令牌没有 匹配预期类型的模式,或者令牌不在 预期类型的范围。
让我们看看nextDouble()
的含义
public double nextDouble()
将输入的下一个标记扫描为double。 此方法将抛出 InputMismatchException如果下一个标记无法转换为 有效的双倍值。如果翻译成功,则扫描仪 超越匹配的输入。
希望你能从这些提示中找到答案。
在您的输入中,前几个数字具有整数类型,您尝试按nextDouble()
读取。因为这个原因,你最终得到了例外。
您可以按照此蓝图解决您的问题
if (input.hasNextInt()) {
System.out.println(input.nextInt());
}else if(input.hasNextDouble()) {
System.out.println(input.nextDouble());
}else{
//Neither int or double
input.nextLine();
continue;
}
解释:如果输入的类型为int,则读取为int或类型为double,读取为double。此外,如果输入既不是int也不是double,则执行其他操作。在int或double部分中,你应该使用nextLine()或使用next()刷新当前令牌来刷新或消耗整行,以便能够读取下一个可能具有整数或双精度类型并继续之后的令牌。