Java"没有这样的元素异常"

时间:2015-01-03 23:05:21

标签: java arrays java.util.scanner

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

这是问题的主要部分:

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 ");// + )
    }
}

3 个答案:

答案 0 :(得分:3)

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

您可以通过

更正此问题
    {li>

    导出异常java.util.NoSuchElementException(此时您只导入IOException

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

  2. 另外,在for循环中:

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

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

答案 1 :(得分:1)

您收到异常,因为您怀疑该文件没有包含足够的整数。

此外,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());
}

答案 2 :(得分:1)

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

但这里有两个问题:

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