从扫描仪读取输入不匹配异常

时间:2015-01-29 21:53:31

标签: java

此代码应该将所有值存储到称为分数的双精度数组中,稍后我将使用它。我得到一个例外。

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 "

1 个答案:

答案 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()刷新当前令牌来刷新或消耗整行,以便能够读取下一个可能具有整数或双精度类型并继续之后的令牌。