添加两个数字时的java.lang.NullPointerException
我是java新手,正在尝试编写一个简单的程序,基本上要求用户输入,然后返回平均值。在尝试添加时,我不断得到添加两个数字时的java.lang.NullPointerException,java,command-line,Java,Command Line,我是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 n
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);
}
}
import java.io.*;
班级人数{
公共静态void main(字符串[]args){
System.out.println(“你好,用户!我是TRON,请说明您希望输入的数字,我将返回平均值…”);//显示字符串。
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
整数loopnum=null;
整数i=null;
Long num=null;
长和=零;
长平均值=零;
试一试{
loopnum=Integer.parseInt(br.readLine());
}
捕获(IOE异常){
System.out.println(“错误!”);
系统出口(1);
}
System.out.println(“好的,现在输入您的号码。”);
对于(i=1;iInitialize!将代码开头的声明更改为Long sum=0L
。此行在循环中有问题:
sum += num;
它与sum=sum+num;
求值是从右到左进行的,您可以看到它试图用null
变量和来添加变量num
。您应该在0L
中初始化Long
变量,而不是null
。更好的是,使用原语类型Long
包装器类型为Long
和int
而不是Integer
,您不需要在此处使用包装器对象!执行以下操作:
int loopnum = 0;
int i = 0;
long num = 0L;
long sum = 0L;
long avg = 0L;
上述操作将消除NullPointerException
,并将避免原语和对象数据类型之间不必要的值装箱/拆箱。使用非空值初始化sum变量。可能是0升
将这一行sum+=num
替换为sum=sum+num
。这样可读性更强。所有其他答案都无法解释为什么会出现空指针异常。您使用的是Long
对象,而不是Long
原语。因此,您可以随时使用直接算术运算(例如+
),编译器将通过调用将Long
解压为Long
。因此sum+=sum
被转换为:
sum = Long.valueOf(sum.longValue() + sum.longValue());
由于sum
为null,因此最终会出现null指针异常。大多数人通过使用primitvelong
来避免这种情况。使用原语long会更好。此外,从右到左的求值也会导致NPE。因为它不是试图将sum添加到null,而是在null引用上调用longValue恩斯。