Java "no such element exception"

Java "no such element exception"

我正在尝试做一个实验,我应该从 numbers.txt 文件中找到模式。但是我在将数字存储在数组中时遇到了问题。我了解如何读取文件,但出于某种原因,当我尝试存储数字时,我得到了 java.util.NoSuchElementException。我认为这意味着我正在使用的扫描仪没有其他任何东西可以读取,但我已经将该方法放入 try-catch 中,所以我不明白发生了什么。

这是问题的主要部分:

int [] modeArray = new int [total];
try {
    in = new Scanner(new File("numbers.txt"));
    for (int x = 0; x <= total; x++) {
        modeArray[x] = in.nextInt();
    }
}
catch (IOException i) {
    System.out.println("Error: " + i.getMessage());
}

如果您想查看本实验的其余部分,请查看其余代码:

import java.util.Scanner;
import java.io.File; 
import java.io.IOException;
/**
 * lab 16.1
 * 
 * @author (Raymond Ma) 
 * @version (1/3/15)
 */
public class firstLab {
    public static void statistics() { 
        Scanner in;
        Scanner inTwo;
        Scanner inThree;
        int total = 0;
        double numbers = 0;
        double num = 0;
        double standardDeviation;

        //Average part
        try {
            in = new Scanner(new File("numbers.txt"));
            while (in.hasNextInt()) {
                total += in.nextDouble(); 
                numbers++;
            }
        }
        catch (IOException i) {
            System.out.println("Error: " + i.getMessage());
        }  
        System.out.println("The Average of this huge list of integers is " + total/numbers);

        //Standard deviation part
        try {
            inTwo = new Scanner(new File("numbers.txt"));
            while (inTwo.hasNextInt()) {
                num = Math.pow((inTwo.nextDouble() - (total/numbers)),2);
            }
        }
        catch (IOException i) {
            System.out.println("Error: " + i.getMessage());
        }
        standardDeviation = Math.sqrt(num/(numbers-1));
        System.out.println("The Standard Deviation of this huge list of integers is " + standardDeviation);

        //This is the most annoying part (the mode)
        int [] modeArray = new int [total];
        try {
            inThree = new Scanner(new File("numbers.txt"));
            for (int x = 0; x <= total; x++) {
                modeArray[x] = inThree.nextInt();
            }
        }
        catch(IOException i) {
            System.out.println("Error: " + i.getMessage());
        }
        System.out.println("The Mode of this huge list of integers is ");// + )
    }
}

正如您所怀疑的那样,您遇到了异常,因为文件中没有包含足够的整数。

此外,NoSuchElementException 不是 IOException,因此它不会被 try-catch 捕获。只需将它添加到 catch 语句中:

int[] modeArray = new int[total];
try (Scanner in = new Scanner(new File("numbers.txt"))) {
    for (int x = 0; x <= total; x++) {
        modeArray[x] = in.nextInt();
    }
} catch (IOException | NoSuchElementException i) {
    System.out.println("Error: " + i.getMessage());
}

NoSuchElementException 不是 IOException。 (请参阅 Javadocs 中的对象层次结构树。)您必须 catch(NoSuchElementException i).

但是这里有两个问题:

  1. 在您的代码中,total 是数字的总和,但您确实想在创建数组时使用 numbers。 (例如,对于数字 3、5、7,有 3 个数字——这就是您在创建数组大小时想要的数字——但 total 将是 15。)
  2. 在您的 for 循环中,您需要 i < total,而不是 i <= total。同样,如果你有三个数字,由于索引计数从 0 开始,数组中的最大索引不是大小 (3),而是大小 - 1 (2)。

NoSuchElementExceptionRuntimeException,而不是 IOException。所以不会被抓到。这是层次结构。

     java.lang.Object
            java.lang.Throwable
                   java.lang.Exception
                           java.lang.RuntimeException
                                    java.util.NoSuchElementException

VS.

     java.lang.Object
             java.lang.Throwable
                     java.lang.Exception
                              java.io.IOException

您可以通过

更正此问题
  1. 正在导入 java.util.NoSuchElementException 的异常(现在你只导入了 IOException

  2. 抓住它。 (例如:catch(NoSuchElementException i)

此外,在您的 for 循环中:

for (int x = 0; x <= total; x++) {
            modeArray[x] = inThree.nextInt();
        }

将x<= total改为x< total,因为数组的索引是从0到total-1。(total是数组大小)