我是java的新手,我正在尝试编写一个简单的程序,它基本上要求用户输入,然后返回平均值。我在尝试添加时不断获得java.lang.NullPointerException
。为什么是这样?这是我到目前为止的代码。
import java.io.*;
class Numbers {
public static void main(String[] args) {
System.out.println("Hello USER! This is TRON, state the number of NUMBERS you wish to enter and I will return the Average..."); // Display the string.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Integer loopnum = null;
Integer i = null;
Long num = null;
Long sum = null;
Long avg = null;
try {
loopnum = Integer.parseInt(br.readLine());
}
catch(IOException e){
System.out.println("Error!");
System.exit(1);
}
System.out.println("OK now enter your numbers.");
for (i=1;i<=loopnum; i++) {
try {
System.out.println("Enter number "+i+":");
num = Long.parseLong(br.readLine());
sum += num;
}
catch(IOException e){
System.out.println("Error!");
System.exit(1);
}
}
avg = sum / loopnum;
System.out.println("TRON here, Your average is: " + avg);
}
}
答案 0 :(得分:1)
初始化!在代码开头将声明更改为Long sum = 0L
。这一行在你的循环中存在问题:
sum += num;
与sum = sum + num;
相同评估从右到左完成,您会看到它尝试添加num
变量和变量null
。
答案 1 :(得分:1)
您应该在Long
中初始化0L
个变量,而不是null
。更好的是,使用原始类型long
而不是包装类型Long
和int
而不是Integer
,您不需要在这里使用包装器对象!这样做:
int loopnum = 0;
int i = 0;
long num = 0L;
long sum = 0L;
long avg = 0L;
上面将摆脱NullPointerException
并避免在原始数据类型和对象数据类型之间不必要的装箱/取消装箱。
答案 2 :(得分:1)
所有其他答案都无法解决您获取空指针异常的原因。您正在使用Long
对象而不是long
原语。因此,只要您使用直接算术运算(例如+
),编译器就会通过调用Long.longValue()
将Long
取消装入long
。所以sum += sum
被翻译为:
sum = Long.valueOf(sum.longValue() + sum.longValue());
由于sum
为null,因此最终会出现空指针异常。大多数人只使用primitve long
来避免这种情况。
答案 3 :(得分:-2)
使用非null值初始化sum变量。也许0L。
将此行sum += num
替换为sum = sum + num
..这更具可读性。