当我运行此代码时,控制台会抛出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;
}
}
答案 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()方法作为检查条件。