2

该程序向用户询问账单,然后他们支付了多少钱,并且应该计算并打印出零钱。我离开了第二部分,因为我遇到的问题是计算第二个 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;
           }
       }
    }
4

2 回答 2

0

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

于 2013-11-09T05:53:43.340 回答
0

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

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

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

将导致 a NullPointerException,因为 in 的值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.

拆箱转换将引用类型的表达式转换为原始类型的相应表达式。具体来说,以下八种转换称为拆箱转换:

  • 从布尔类型到布尔类型

  • 从字节类型到字节类型

  • 从短类型到短类型

  • 从字符型到字符型

  • 从 Integer 类型到 int 类型

  • 从 Long 类型到 long 类型

  • 从浮点型到浮点型

  • 从 Double 类型到 double 类型

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

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

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

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

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

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

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

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

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

  • 如果 r 为 null,则拆箱转换将引发 NullPointerException

于 2013-11-09T05:42:21.907 回答