Do While循环跳过语句

时间:2012-03-28 16:51:34

标签: java arrays static

在我的do while循环中,身体最初工作正常,但是当它循环时,它会打印前两个语句,但是它不允许我输入名称而是直接输入pin和我输入的任何内容它会跳过其余部分并询问我是否需要进行其他交易。

我有一个部分归档的数组对象。对象中的变量是名称,引脚,帐号和余额。当我添加新对象并设置余额时,我输入的新余额会导致前一个对象的余额也发生变化。我认为它与平衡变量被声明为静态有关,但我不会使它静态,我可以错误“不能从类型CustomerRecord中对非静态方法提取静态引用(double)”。 (已解决)谢谢。

public class BankCustomers 
{
public static void main(String[] args)

    //------------------------------------------------
    //Part4: Find a customer record from anotherArray 
    //to do transaction(s) and update the record's balance

    char repeat; // User control to repeat or quit
    Scanner keyboard = new Scanner(System.in); //creating the scanner

    String aName;
    int aPin;
    double aWithdraw;
    double aDeposit;

    do{   


        //Read customer information before search
        System.out.println();
        System.out.println("Lets make a transaction");
        System.out.println("Enter customer full name");
        aName = keyboard.nextLine( );

        System.out.println("Enter Pin");
        aPin = keyboard.nextInt();


        //Search an Array for equal aName and aPin
        for (int i = 0; i < index; i++)
        {
            CustomerRecord cRecord = anotherArray[i];
                if((cRecord.getName().equalsIgnoreCase(aName)) && (cRecord.getPin()           ==(aPin)))
                {
                    System.out.println(cRecord);

                    System.out.println("Enter Withdraw Amount");
                    aWithdraw = keyboard.nextDouble();
                    CustomerRecord.withdraw(aWithdraw);

                    System.out.println("Enter Deposite Amount");
                    aDeposit = keyboard.nextDouble();
                    CustomerRecord.deposit(aDeposit);  
                    System.out.println(cRecord);             
                }                               
        }


        System.out.println("\nAnother Transaction? (y for yes)");
        repeat = keyboard.next().charAt(0);

    }while(repeat == 'y' || repeat == 'Y');

        //Print the records on screen
    for (int i = 0; i < index; i++)
        System.out.print(anotherArray[i]);

    }                           

5 个答案:

答案 0 :(得分:2)

中删除静电
private static double balance

public static void deposit(double aDeposit)

public static void withdraw(double aWithdraw)

您不希望它们是静态的,因为您要直接从您创建的对象调用这些方法,因此它们将特定于每个CustomerRecord

然后在您的代码中,更改以下行:

CustomerRecord.deposit(aDeposit);
CustomerRecord.withdraw(aDeposit);

由:

cRecord.deposit(aDeposit);
cRecord.withdraw(aDeposit);

现在进行的修改将应用于每个CustomerRecord balance变量,而不应用于单个balance变量(整个程序是唯一的),因为它是静态的情况

答案 1 :(得分:1)

public class CustomerRecord implements Serializable
{
    private String name;
    private int pin;
    private int account;
    private double balance;
}

public void deposit(double aDeposit)
{
    balance = balance + aDeposit;
}

public void withdraw(double aWithdraw)
{
    if (balance >= aWithdraw) balance = balance - aWithdraw;
    else System.out.println("Withdraw cannot be negativeegative");
}
  1. 如您所述,让balance非静态。这将修复错误。
  2. 使CustomerRecord#deposit()#withdraw()方法也是非静态的。这将修复由#1。
  3. 引起的编译错误

答案 2 :(得分:1)

你说问题是你让事情变得静止。 balancedepositwithdraw都不应该是静态的,因为所有这些都是适用于特定客户记录的内容,而不是同时适用于所有客户记录。

如果您的代码不是静态的,那么您的代码无效的事实与您调用withdraw方法的方式有关:CustomerRecord.withdraw(aWithdraw)。既然你已经注意到了它,你能看出它有什么问题吗?

答案 3 :(得分:1)

CustomerRecord的实例变量中,您将balance声明为静态变量。

这意味着,只要您在类的一个实例中更改balance,它就会在所有实例中更改。例如,存款和取款方式。

我假设您需要使静态平衡才能使这两种方法起作用,但您应该从这三种方法中取出静态声明。然后,您需要更改来自

的所有呼叫
CustomerRecord.withdraw();
CustomerRecord.deposit();

使用类的实例而不仅仅是静态类。所以,

// Whatever values you want here, you seem to have 4 already declared so you can use those
CustomerRecord c = new CustomerRecord("", 0, 0, 0);

c.withdraw();
c.deposit();

答案 4 :(得分:0)

你的问题有两个:

首先,balance istatic,这意味着它与类相关联,而不是与其任何实例(对象)相关联,或者在其他术语中,它在该类的所有实例之间共享。

其次,正如您所指出的那样,您的静态方法withdraw正在访问balance。关于静态的考虑也适用于此 - 该方法与类相关联,并且不能访问非静态的成员。

要解决第二个问题,请从withdraw声明中删除静态(并从balance删除静态.Thy将使您的代码CustomerRecord.withdraw()无法编译,因为{{1}现在没有与类本身相关联,而是它的一个实例。所以你需要使用一个实例并在那个上调用withdraw

withdraw

同样适用于cRecord.withdraw(aWithdraw);