Null with Array java.lang.NullPointerException

时间:2013-11-09 05:38:04

标签: java 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;
           }
       }
    }

2 个答案:

答案 0 :(得分:0)

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

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

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

  

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

     
      
  • 从类型Boolean到类型boolean

  •   
  • 从类型字节到类型字节

  •   
  • 从短类型到短类型

  •   
  • 从类型字符到类型字符

  •   
  • 从类型Integer到类型int

  •   
  • 从类型Long到类型长

  •   
  • 从类型Float到类型float

  •   
  • 从类型Double到类型double

  •   
     

在运行时,取消装箱转换过程如下:

     
      
  • 如果r是布尔类型的引用,则取消装箱转换会转换   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是Float类型的引用,则取消装箱转换会将r转换为   r.floatValue()

  •   
  • 如果r是Double类型的引用,则取消装箱转换会转换   r进入r.doubleValue()

  •   
  • 如果r为null,则取消装箱转换会抛出NullPointerException

  •   

答案 1 :(得分:0)

在初始化Dollar引用变量之前,最初它包含null表示它不指向任何对象,如果我们尝试访问则包含null,那么它将在上面的程序中给出Null pointer exception