程序运行后出现Java错误

时间:2015-04-10 01:04:57

标签: java

我的程序完成了我想要它做的所有事情,但是在它完成运行之后我会弹出这个错误。查看我的代码,我无法找到错误发生的位置。

Exception in thread "main" java.lang.IllegalStateException: Scanner closed
at java.util.Scanner.ensureOpen(Scanner.java:1070)
at java.util.Scanner.next(Scanner.java:1465)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at simplestatistics.SimpleStatistics.main(SimpleStatistics.java:102)

输入 - > Java结果:1     package simplestatistics;

import java.util.*;
import java.lang.*;
import java.util.InputMismatchException;

public class SimpleStatistics {

public static double[] getUserInput(Scanner sc) {

    List<Double> inputList = new ArrayList<Double>();

    System.out.println("Please enter how many numbers you will be inputing");
    int numberOfInputs = sc.nextInt();

    for (int i = 0; i < numberOfInputs; i++) {
        System.out.println("Please enter a number");
        double userInput = sc.nextDouble();
        inputList.add(userInput);
    }
    sc.close();

    double[] arr = new double[inputList.size()];
    for (int i = 0; i < arr.length; i++) {
        arr[i] = inputList.get(i);
    }
    return arr;
}

public static double arithmeticMean(double[] nums) {

    double mean = 0;
    double sum = 0;

    for (int i = 0; i < nums.length; i++) {
        sum = sum + nums[i];
    }
    mean = sum / nums.length;

    return mean;
}

public static double geometricMean(double[] nums) {

    double gm = 1.0;
    for (int i = 0; i < nums.length; i++) {
        gm *= nums[i];
    }
    gm = Math.pow(gm, 1.0 / (double) nums.length);
    return gm;
}

public static double[] minAndmax(double[] nums) {

    double min = nums[0];
    double max = nums[0];

    for (int i = 1; i < nums.length; i++) {
        if (nums[i] < min) {
            min = nums[i];
        } else if (nums[i] > max) {
            max = nums[i];
        } else {

        }
    }

    double[] minAndmax = {min, max};
    return minAndmax;
}

public static double[] scaleUp(double[] nums, int factor) {

    for (int i = 0; i < nums.length; i++) {
        nums[i] *= factor;
    }
    return nums;
}

public static double[] scaleDown(double[] nums, int factor) {

    for (int i = 0; i < nums.length; i++) {
        nums[i] /= factor;
    }
    return nums;
}

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    double[] input = {1, 2.8, 5.3, 100, -5, -6.5};

    System.out.println("Choose a option 1-6");

    boolean exit = false;
    while (!exit) {
        System.out.println();
        System.out.println("1) Arithmetic mean, 2) Geometric mean, 3)  minAndmax, 4)  Scale Up, 5)  Scale Down, 6)  Quit");
        System.out.print("Input -> ");
        int choice = sc.nextInt();
        System.out.println();

        switch (choice) {
            case 1: {
                // Arithmetic mean
                System.out.println("Arithmetic mean");
                System.out.println(arithmeticMean(getUserInput(sc)));
                break;
            }
            case 2: {
                // Geometric mean
                System.out.println("Geometric mean");
                System.out.println(arithmeticMean(getUserInput(sc)));
                break;
            }
            case 3: {
                // Min and max
                System.out.println("Min and Max");
                for (double i : minAndmax(getUserInput(sc))) {
                    System.out.print(i + ", ");
                }
                break;
            }
            case 4: {
                // Scale Up
                System.out.println("Scale Up");
                System.out.print("Please enter factor by which you want to scale -> ");
                int factor = sc.nextInt();
                for (double i : scaleUp(input, factor)) {
                    System.out.print(i + ", ");
                }
                break;
            }

            case 5: {
                // Scale Down
                System.out.println("Scale Down");
                System.out.print("Please enter factor by which you want to scale -> ");
                int factor = sc.nextInt();
                for (double i : scaleDown(input, factor)) {
                    System.out.print(i + ", ");
                }
                break;
            }

            case 6: {
                exit = true;
                break;
            }

        }
    }
}

}

这是我的代码的链接

https://gist.github.com/Chunky1022/0775fba6692456ae1c8c#file-gistfile1-txt

1 个答案:

答案 0 :(得分:2)

首次拨打getUserInput时,请关闭扫描仪。

public static double[] getUserInput(Scanner sc) {

    ...

    sc.close();

    ...
}

只需删除sc.close行。

如果您确实要关闭它,请在确定不再使用此扫描仪时将其关闭。但是,我不明白为什么要关闭System.in