Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 变量可能尚未初始化,在初始化时不起作用_Java - Fatal编程技术网

Java 变量可能尚未初始化,在初始化时不起作用

Java 变量可能尚未初始化,在初始化时不起作用,java,Java,我试图编写一个程序,以美元、25美分、10美分等形式输出付款的变化。我在程序开始时声明所有硬币变量,但不初始化它们,当我稍后在程序中尝试初始化它们时,会出现此错误。所以,我只是将它们初始化为0来初始化它们,然后它没有意识到我正在更改值,它们保持在0 import java.util.Scanner; public class ChangeClient { public static void main(String[] args) { Scanner kb = ne

我试图编写一个程序,以美元、25美分、10美分等形式输出付款的变化。我在程序开始时声明所有硬币变量,但不初始化它们,当我稍后在程序中尝试初始化它们时,会出现此错误。所以,我只是将它们初始化为0来初始化它们,然后它没有意识到我正在更改值,它们保持在0

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()比较?编辑我的答案以包含您问题的答案!