Null with Array java.lang.NullPointerException



该程序要求用户提供账单,然后他们为此支付了多少费用,并应该计算并打印出更改。我省略了第二部分,因为我遇到的问题是计算第二个 for 循环中的变化。根据用户输入,发生的错误java.lang.NullPointerException在不同的角、四分之一、镍线上等。我已经查找了问题,人们说这是程序试图获取一个null的值,但我不明白如何,因为我正在更新。

提前感谢您的帮助

    Scanner s = new Scanner(System.in);
    Double[] Bill = new Double[5];
    Double[] Paid = new Double[5];
    for (int i = 0; i < 1; i++) {
        int j = i + 1;
        System.out.print("Enter bill " + j + ": ");
        Bill[i] = Double.parseDouble(s.nextLine());
        System.out.print("Enter amount paid for bill " + j + ": ");
        Paid[i] = Double.parseDouble(s.nextLine())
        System.out.println("");        
    }
    Integer[] Dollars = new Integer[5];
    Integer[] Quarters = new Integer[5];
    Integer[] Dimes = new Integer[5];
    Integer[] Nickels = new Integer[5];
    Integer[] Pennies = new Integer[5];   
    for (int i = 0; i < 1; i++){
       Double Change = Paid[i] - Bill[i];
       while (Change > 0){
           if (Change > 1){
               Change = Change - 1;
               Dollars[i] = Dollars[i] + 1;   
           }
           else if (Change > 0.25){
               Change = Change - 0.25;
               Quarters[i] = Quarters[i] + 1;
           }
           else if (Change > .1){
               Change = Change - 0.1;
               Dimes[i] = Dimes[i] + 1;
           }
           else if (Change > .05){
               Change = Change - 0.05;
               Nickels[i] = Nickels[i] + 1;
           }
           else if (Change > 0){
               Change = Change = 0.01;
               Pennies[i] = Pennies[i] + 1;
           }
       }
    }

通过创建新数组,您只为元素创建空间,但不实例化其中的任何内容。 数组使用默认值初始化其元素,所有引用类型(或对象)的默认值为 null

任何执行任何类型的自动拆箱的行 - 即这个:

Dollars[i] = Dollars[i] + 1;  

将导致NullPointerException,因为 Dollars[i] 中的值没有初始化为任何内容 - 默认情况下它是null的。

将每个数组中的值初始化为合理的值。 例如,您可以有一个仅初始化Integer[]元素以Integer.valueOf(0)的方法。

public void initializeArrays(Integer[] array) {
    for(int i = 0; i < array.length; i++) {
        array[i] = Integer.valueOf(0);
    }
}

在使用数组中的任何值之前调用它。

从 JLS 中,强调我的:未装箱的null装箱值会导致NullPointerException

取消装箱转换将引用类型的表达式转换为 基元类型的相应表达式。具体来说, 以下八次转换称为拆箱转换:

  • 从布尔类型到布尔类型布尔值

  • 从字节类型到字节类型

  • 从短型到短型

  • 从字符类型到字符类型

  • 从整数类型到 int 类型

  • 从长型到长型

  • 从浮点型到浮点型

  • 从双型到双型

在运行时,拆箱转换按如下方式进行:

  • 如果 r 是布尔类型的引用,则拆箱转换将转换 r into r.booleanValue()

  • 如果 r 是 Byte 类型的引用,则拆箱转换将转换 r into r.byteValue()

  • 如果 r 是字符类型的引用,则取消装箱转换 将 r 转换为 r.charValue()

如果 r 是 Short 类型的引用,则拆箱转换将转换 r into r.shortValue()

  • 如果 r 是 Integer 类型的引用,则拆箱转换将转换 r into r.intValue()

  • 如果 r 是 Long 类型的引用,则拆箱转换将转换 r into r.longValue()

  • 如果 r 是 Float 类型的引用,则拆箱转换会将 r 转换为 r.floatValue()

  • 如果 r 是 Double 类型的引用,则拆箱转换将转换 r 成 r.doubleValue()

  • 如果 r 为 null,则取消装箱转换将引发 NullPointerException

在初始化 Dollar 引用变量之前,最初它包含 null 意味着它不指向任何对象,而包含 null 如果我们尝试访问,那么它将像您上面的程序一样给出Null pointer exception

相关内容

最新更新