读取文件时出现NoSuchElementException

时间:2017-11-08 06:47:49

标签: java

当我运行此代码时,控制台会抛出NoSuchElementException。这是为什么?是不是文件被打开了?错误说它对应于第34行。为什么?  Scanner是否正在读取文件中的输入?请帮忙。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;

public class standardDeviation {

public static void main(String[] args) throws FileNotFoundException{
    // TODO Auto-generated method stub
    File myFile = new File("input_data.txt");

    PrintWriter output = new PrintWriter(myFile);
    output.print("78.76 96.7 65.65 95.64 68.5 6.54 54.6");
    output.close();

    Scanner input = new Scanner(System.in);
    System.out.print("Enter the name of the file: ");
    String fileName = input.nextLine();

    double sd = deviation(myFile);
    System.out.println("The standard deviation of the values in this file is: " + sd);

    }

public static double deviation(File myFile) throws FileNotFoundException{   

    Scanner in = new Scanner(myFile);

    int i = 0; 
    double sum = 0;
    double sigmaXI2 = 0;
    while(i != -1){
        double num = in.nextDouble();
        sum += num;
        sigmaXI2 += Math.pow(num, 2);
        i++;
    }
    double sigmaXI_2 = Math.pow(sum, 2);
    double s = Math.sqrt((sigmaXI2 - (sigmaXI_2)/i)/(i-1));



    return s;
}
}

1 个答案:

答案 0 :(得分:0)

你什么时候期望循环结束?

 while(i != -1)

我不断增加,没有休息。

根据Scanner.nextDouble()的JavaDoc

  

将输入的下一个标记扫描为double。这个方法会抛出   InputMismatchException如果下一个标记无法转换为   有效的双倍价值。如果翻译成功,则扫描仪   超越匹配的输入。

     

如果下一个标记与上面定义的Float正则表达式匹配   然后将令牌转换为double值,就像删除all一样   区域设置特定前缀,组分隔符和特定于区域设置   后缀,然后通过非ASCII数字映射到ASCII数字   Character.digit,如果区域设置特定,则在前面加一个负号( - )   存在负前缀和后缀,并传递结果   字符串到Double.parseDouble。如果令牌与本地化的NaN匹配   或无穷大字符串,然后传递给“南”或“无限”   Double.parseDouble视情况而定。返回:从中扫描的双精度数   input抛出:InputMismatchException - 如果下一个标记没有   匹配Float正则表达式,或超出范围

     

NoSuchElementException - 如果输入已用尽

     

IllegalStateException - 如果此扫描程序已关闭

当所有令牌因无限循环而耗尽时,抛出NoSuchElementException。 要解决此问题,请使用hasNextDouble()方法作为检查条件。