该程序要求用户提供账单,然后他们支付了多少费用,并且应该计算并打印出更改。我离开了第二部分因为我的问题是计算第二个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;
}
}
}
答案 0 :(得分:0)
通过创建一个新数组,您只为元素创建空间,但不实例化 内的任何内容。对于所有引用类型(或对象),数组使用默认值初始化其元素and the default value为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
。
取消装箱转换会将引用类型的表达式转换为 原始类型的相应表达式。具体来说, 以下八次转化称为拆箱转化:
从类型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
。