gpt4 book ai didi

java - 部分填充的数组和 NullPointerException

转载 作者:行者123 更新时间:2023-12-02 04:15:34 25 4
gpt4 key购买 nike

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

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

如果用户没有输入全部 500 个整数,我不知道如何将数组初始化为 500,并且不会出现错误或计算不正确。

注意:不向用户提示,也不允许退出短语,当用户按 Enter 键时应该退出。这是我的代码,感谢您提供任何提示或为我指明正确的方向!

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;
}

最佳答案

线路

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. 查找其他类似的错误。

关于java - 部分填充的数组和 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33360425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com