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

时间:2016-09-08 02:32:36

标签: java

我正在尝试编写一个程序,以美元,四分之一,硬币等方式输出付款的变化。我在程序开头声明了所有的硬币变量,但是没有初始化它们,我得到了我尝试在程序中稍后初始化它时出现此错误。所以,我只是将它们初始化为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);
        }
    }
}

我知道有很多人会遇到这样的错误,我已经查看了所有这些错误以找到解决方案,但是没有一个与我遇到的问题相同。

3 个答案:

答案 0 :(得分:1)

我认为问题在于:

`newChange = change;

    if (activity.Type == ActivityTypes.Message)
    {
        Activity typing = activity.CreateReply(null);
        typing.ServiceUrl = activity.ServiceUrl; //bug in ms bot framework? otherwise service URL is null
        typing.Type = ActivityTypes.Typing;
        ConnectorClient connector = new ConnectorClient(new Uri(typing.ServiceUrl));
        await connector.Conversations.SendToConversationAsync(typing);

        //do the actual bot's work here

如果将newChange设置为更改,则newChange-change将始终为0。 因此,您所有的if语句都将评估为false。

对于精度问题: 一个简单的解决方案是将输入乘以100并使用整数。想想处理美分而不是美元; - )

答案 1 :(得分:0)

你的问题在于这项任务:

newChange = change;

遵循这些比较:

if ((newChange - change) != 0 && newChange >= .25) 
if (newChange - change != 0 && newChange >= .10) 
etc...

您初始化newChange = change,因此newChange - change将始终等于零,并且您的所有if块都将被跳过。

还有一些说明:

- 使用IDE的调试模式。您可以设置断点并在程序执行每一行时查看变量的值。 Java有很棒的调试(包括远程调试)。以下是您的程序在我的IDE(Eclipse Neon)中的外观:

debugging in Eclipse Neon

- 全功能的Java 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将指向firstsecond的指针进行比较,指向内存中的不同位置(因为每个变量在内存中分配了自己的空间first和{ {1}}只是对这些位置的引用)。

这个重构在所有情况下都会有预期的行为:

second

Double类的作者已经实现了Double first = 3.5; Double second = 3.5; boolean equal = first.equals(second); // true 方法,该方法确保比较值是值,而不是引用。这是OO编程的另一个优势;您可以.equals()使用默认的@Override方法,并根据您想要的任何条件实施自己的方法。例如,如果您希望基于其中一个或两个字段将两个类实例视为相等,则这非常有用。在你的情况下,使用.equals()原语,使用double当然并不重要,但这是一个很好的习惯,或者你会遇到.equals()类和其他人的惊喜。

祝你好运!

答案 2 :(得分:0)

我已经更正了您的代码。

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);
            }






        }
    }
}

你使用过的newChange是错误的,正如其他人指出的那样,你甚至不需要它。如果你经过我的更正,我已经使用了变化本身来贯穿整个过程。希望这会有所帮助。