【问题标题】:Partially filled array and NullPointerException部分填充的数组和 NullPointerException
【发布时间】:2015-10-27 05:18:39
【问题描述】:

我遇到了一些问题,我想我知道发生了什么我只是不知道如何解决它。

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

如果用户没有输入所有 500 个 int,我不知道如何将数组初始化为 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;
}

【问题讨论】:

  • 进行空检查? if(scores[i] != null)

标签: java arrays nullpointerexception null


【解决方案1】:

线

private static int intScoresArr[];

声明数组,它不会创建它。您发布的代码不会在任何地方创建数组,因此intScoresArrnull

你需要的地方

intScoresArr = new int[x];

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

我说“某处”是因为代码在 while 循环中使用了 intScoresArr,它似乎不需要 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 -------^^^^^^^^^^^^^^^^^

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

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

总结

  1. 删除intScoresArrinputArr的类范围声明

  2. main 中声明它们,在main 的顶部或while 循环内:

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

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

【讨论】:

  • 这不是我在解析 inputArr 的 for 循环中所做的吗?
  • @sjud9227:不。您正在尝试填写其条目,但您还没有创建数组本身。
  • 好的,所以如果我将它初始化为 500 的大小,当用户没有输入所有 500 个元素时,我会遇到问题,因为剩余部分设置为 0
  • @sjud9227:我从来没有说过你应该将它初始化为 500。
  • 我建议在您的代码中使用 ArrayList 而不是 Array。数组是不可变的,这显然会给您带来问题。考虑到您的目标,ArrayList 会更好地工作。
猜你喜欢
  • 2021-12-16
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 2014-02-16
  • 2019-09-18
相关资源
最近更新 更多