部分填充数组和NullPointerException

时间:2015-10-27 05:18:40

标签: java arrays nullpointerexception null

我遇到了一些问题,我想我知道该怎么回事,我只是不知道如何修复它。

分配是用户可以输入最多 500 int(使用BufferedReader而不是扫描仪)并将int传递给方法并进行一些计算。输入进入一行,中间有空格,当用户点击进入时停止。 我的问题是计算中位数,现在我得到一个NullPointerException。我的int数组初始化为500,字符串数组没有初始化,但Median方法总是计算到0,我意识到这是因为我将所有500个索引传递给计算,并且没有使用的索引被设置为零。

我不知道如何将数组初始化为500并且如果用户没有输入所有500个内容,则不会出错或计算错误。

注意:没有提示给用户并且不允许退出短语,它应该在用户点击进入时退出。这是我的代码,感谢您的任何提示或指导我正确的方向!

public class StatPackage {
    private static int intScoresArr[];
    private static String inputArr[] = new String [500];

public static void main(String[] args) throws IOException {
    String inputValues;
    double count = 0;
    double average, median;
    NumberFormat NF = NumberFormat.getNumberInstance();
    NF.setMinimumFractionDigits(2);
    NF.setMaximumFractionDigits(2);
    InputStreamReader ISR = new InputStreamReader(System.in);
    BufferedReader BR = new BufferedReader(ISR);

    while((inputValues = BR.readLine()) != null) {
        inputArr = inputValues.split("\\s");
        for(int i = 0; i < inputArr.length; i++) {
            intScoresArr[i] = Integer.parseInt(inputArr[i]);
            count++;
        }
        //Call calcMean calculate average
        average = calcMean(intScoresArr, count);
        System.out.println(NF.format(average));

        //Call calcMedian, calculate median
        median = calcMedian(intScoresArr, count);
        System.out.println(median); 
    }
}

//Calculate the mean (average)
public static double calcMean(int scores[], double count) {
    double average = 0;
    for(int i = 0; i < inputArr.length; i++) {
        average = average + scores[i] / count;
    }
    return average;
}


public static double calcMedian(int scores[], double count) {
    Arrays.sort(scores);
    double middle = 0;
    int countInt;

    if(count % 2 == 1) {
        count = (count + 1) / 2;        
        middle = scores[(int)count - 1];
    }
    else if(count % 2 == 0) {
        count = (count + 1) / 2;
        middle = (scores[(int)count] + scores[(int)count+1]) / 2;
    }
    return middle;
}

1 个答案:

答案 0 :(得分:2)

该行

private static int intScoresArr[];

只有声明数组,它不会创建它。您发布的代码不会在任何位置创建数组,因此intScoresArrnull

某处,你需要

intScoresArr = new int[x];

...其中x是所需数组的大小。

我说“某个地方”,因为代码在intScoresArr循环中使用while,似乎不需要intScoresArr作为字段,更不用说静态字段了。看起来它应该是一个本地的:

while((inputValues = BR.readLine()) != null) {
    inputArr = inputValues.split("\\s");
    int[] intScoresArr = new int[inputArr.length]; // <============= here
    for(int i = 0; i < inputArr.length; i++) {
        intScoresArr[i] = Integer.parseInt(inputArr[i]);
        count++;
    }
    //Call calcMean calculate average
    average = calcMean(intScoresArr, count);
    System.out.println(NF.format(average));

    //Call calcMedian, calculate median
    median = calcMedian(intScoresArr, count);
    System.out.println(median); 
}

(并删除静态声明。)

同样,intScores也不应该是一个类范围的静态;如果你把它变成本地的,calcMean中的这个错误会被编译器捕获:

public static double calcMean(int scores[], double count) {
    double average = 0;
    for(int i = 0; i < inputArr.length; i++) {
    //                 ^------------------------------ should be `scores`
        average = average + scores[i] / count;
    }
    return average;
}

有趣的是,您创建了一个从未使用过的数组,并将其存储在intScores中:

private static String inputArr[] = new String [500];
// This array is never used -------^^^^^^^^^^^^^^^^^

您立即覆盖inputArr循环中while的值:

inputArr = inputValues.split("\\s");

摘要

  1. 删除intScoresArrinputArr

  2. 的班级声明
  3. main的{​​{1}}顶部或main循环中声明它们:

    while
  4. 修复while((inputValues = BR.readLine()) != null) { int[] inputArr = inputValues.split("\\s"); int[] intScoresArr = new int[inputArr.length]; 以使用其输入参数。

  5. 寻找其他类似的错误。