添加两个数字时的java.lang.NullPointerException

添加两个数字时的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新手,正在尝试编写一个简单的程序,基本上要求用户输入,然后返回平均值。在尝试添加时,我不断得到
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指针异常。大多数人通过使用primitve
long

来避免这种情况。使用原语long会更好。此外,从右到左的求值也会导致NPE。因为它不是试图将sum添加到null,而是在null引用上调用longValue恩斯。