Java 变量可能尚未初始化,在初始化时不起作用
我试图编写一个程序,以美元、25美分、10美分等形式输出付款的变化。我在程序开始时声明所有硬币变量,但不初始化它们,当我稍后在程序中尝试初始化它们时,会出现此错误。所以,我只是将它们初始化为0来初始化它们,然后它没有意识到我正在更改值,它们保持在0Java 变量可能尚未初始化,在初始化时不起作用,java,Java,我试图编写一个程序,以美元、25美分、10美分等形式输出付款的变化。我在程序开始时声明所有硬币变量,但不初始化它们,当我稍后在程序中尝试初始化它们时,会出现此错误。所以,我只是将它们初始化为0来初始化它们,然后它没有意识到我正在更改值,它们保持在0 import java.util.Scanner; public class ChangeClient { public static void main(String[] args) { Scanner kb = ne
import java.util.Scanner;
public class ChangeClient {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int dollars = 0;
int quarters = 0;
int dimes = 0;
int nickles = 0;
int pennies = 0;
double change = 0.0;
double newChange = 0.0;
System.out.println("How much was it? ");
double cost = kb.nextDouble();
System.out.println("What did you pay with? ");
double payment = kb.nextDouble();
if(payment-cost == 0) {
change = 0.0;
}
else {
change = payment - cost; //4.73
newChange = change;
if((newChange-change != 0 && newChange >= 1)) {
dollars = (int)(change/1);//dollars = 4
newChange = (change - dollars);// newchange = .73
}
if((newChange - change) != 0 && newChange >= .25) {
quarters = (int)(newChange/.25); //quarters = 2
newChange = (change - (dollars + (quarters*.25))); //newchange = 4.73 - (4+ (2*.25)) = .23
}
if(newChange - change != 0 && newChange >= .10){
dimes = (int)(newChange/.10); //dimes = 2
newChange = (change -(dollars + (quarters * .25) + (dimes * .10))); //newchange = 4.73 - (4+ (2*.25) + (2*.10)) = .03
}
if(newChange - change != 0 && newChange >= .05) {
nickles = (int)(newChange/.05);
newChange = (change -(dollars + (quarters * .25) + (dimes * .10) + (nickles * .05))); //newchange is less than .05 so skip
}
if(newChange - change != 0 && newChange >= .01) {
pennies = (int)(newChange/.01); //pennies = 3
newChange = (change -(dollars + (quarters * .25) + (dimes * .10) + (nickles * .05) + (pennies * .01))); //newchange (4.73 - (4 + (2*.25) + (2 .10) + (3*.03))) = 0
}
System.out.println("Dollars: " + dollars);
System.out.println("Quarters: " + quarters);
System.out.println("Dimes " + dimes);
System.out.println("Nickles " + nickles);
System.out.println("Pennies " + pennies);
System.out.println("Total change due: " + change);
}
}
}
我知道有很多人会犯这样的错误,我已经仔细检查了所有这些错误,以找到解决方案,但没有一个与我遇到的问题相同 您的问题在于此作业:
newChange = change;
进行了以下比较:
if ((newChange - change) != 0 && newChange >= .25)
if (newChange - change != 0 && newChange >= .10)
etc...
您初始化newChange=change
,因此newChange-change
将始终等于零,所有if
块将被跳过
还有几点注意:
-考虑使用IDE的调试模式。您可以设置断点,并在程序执行每一行时查看变量值。Java具有出色的调试(包括远程调试)。以下是您的程序在my IDE(Eclipse Neon)中的外观:
-功能齐全的JavaIDE(两大IDE是Eclipse和IntelliJ,尽管NetBeans在我的办公室里至少有一个爱好者)利用了编译时类型安全、调试和Java约定的许多特性。您可以通过一个操作在整个应用程序中重命名一个变量或方法,您可以查看您试图调用的方法是否存在,甚至可以调用一个尚不存在的方法,并让IDE为您将其删除。所有这些都是可能的,因为IDE在您编写代码时一直在后台编译代码,所以它知道使用类、变量或方法的每个位置。调试允许我在10秒内(我没有骗你)找到你代码中的错误。这就是我们为企业级应用程序编写Java的原因
-考虑使用对象Double和Integer而不是原语类型Double和int,并使用比较.equals()
。在面向对象的世界中,我们更喜欢从比较本身中抽象出比较的实现。考虑这个例子:
Double first = 3.5;
Double second = 3.5;
boolean equal = (first == second); // false
在本例中,Java将指针与指向内存中不同位置的first
和second
进行比较(因为每个变量都在内存中分配了自己的空间,first
和second
只是对这些位置的引用)
此重构在所有情况下都具有预期的行为:
Double first = 3.5;
Double second = 3.5;
boolean equal = first.equals(second); // true
Double类的作者实现了一个.equals()
方法,该方法确保比较的是值,而不是引用。这是OO编程的另一个优势;您可以@重写默认的.equals()
方法,并根据您想要的任何条件实现自己的方法。例如,如果您希望仅基于两个类实例的一个或两个字段将其视为相等,则这非常有用。在您的情况下,使用double
原语,使用.equals()
当然不是很重要,但这是一个很好的习惯,否则您将遇到字符串
类和其他类带来的惊喜
祝你好运 我认为问题在于:
`新变化=变化
if((newChange-change != 0 && newChange >= 1)) `
如果将newChange设置为change,则newChange始终为0。
所以你所有的if语句都将被评估为false
对于精度问题:
一个简单的解决方案是将输入乘以100,然后使用整数。想一想如何处理美分而不是美元;-) 我已更正了您的代码
import java.util.Scanner;
public class ChangeClient {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int dollars;
int quarters;
int dimes;
int nickles;
int pennies;
double change;
double newChange;//no need of newChange
System.out.println("How much was it? ");
double cost = kb.nextDouble();
System.out.println("What did you pay with? ");
double payment = kb.nextDouble();
if(payment-cost == 0) {
change = 0.0;
}
else {
change = payment - cost; //4.73
if(change >= 1) {
dollars = (int)(change/1);//dollars = 4
change = (change - dollars);// change = .73
System.out.println("Dollars: " + dollars);
}
if(change >= .25) {
quarters = (int)(change/.25); //quarters = 2
change = (change - quarters*.25); //change = .73-2*.25 = .23
System.out.println("Quarters: " + quarters);
}
if(change >= .10){
dimes = (int)(change/.10); //dimes = 2
change = (change -dimes * .10); //change = .23-2*.10 = .03
System.out.println("Dimes " + dimes);
}
if(change >= .05) {
nickles = (int)(change/.05);
change = (change -nickles * .05); //change is less than .05 so skip
System.out.println("Nickles " + nickles);
}
if(change >= .01) {
pennies = (int)(change/.01); //pennies = 3
change = (int)(change -pennies * .01); //change = .03 - 3*.01 = 0
System.out.println("Pennies " + pennies);
System.out.println("Total change due: " + change);
}
}
}
}
正如别人指出的,你用过的新零钱是错误的,你甚至不需要它。如果你看了我的更正,我一直在使用更改本身。希望这有帮助。看起来像是一个整数除法问题。将变量更改为double
,然后查看这是否会改变内容。但是,值仍然不变。我在打字,所以可以只保留整数部分,然后说有四个四分之一。只是为了澄清我为什么把它放在那里。试着用调试工具逐步调试它。即使在修复错误之后,由于浮点精度的原因,您可能仍然有问题。如果您认为newChange
是.10,那么它实际上可能类似于.099999,因为double
值不能准确表示.10。在这种情况下,newChange>=.10
在您认为应该为真时将为假。我建议您使用整数来表示所有以便士表示的值,并且只在输入和输出时使用double
,而不用于计算。要么这样,要么用BigDecimal
:-D在同一时间重复同一个答案哦,天哪,我不敢相信我错过了。不过非常感谢。那么,您是否推荐像eclipse这样的IDE而不是像Sublime text这样的编辑器?还有,为什么要使用这些类型和.equals()比较?编辑我的答案以包含您问题的答案!