我遇到了一些问题,我想我知道该怎么回事,我只是不知道如何修复它。
分配是用户可以输入最多 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;
}
答案 0 :(得分:2)
该行
private static int intScoresArr[];
只有声明数组,它不会创建它。您发布的代码不会在任何位置创建数组,因此intScoresArr
为null
。
某处,你需要
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");
删除intScoresArr
和inputArr
在main
的{{1}}顶部或main
循环中声明它们:
while
修复while((inputValues = BR.readLine()) != null) {
int[] inputArr = inputValues.split("\\s");
int[] intScoresArr = new int[inputArr.length];
以使用其输入参数。
寻找其他类似的错误。