【问题标题】:If statement is being missed in Bank Account Class?如果银行账户类中遗漏了对帐单?
【发布时间】:2013-05-13 10:17:39
【问题描述】:

我在使用以下语法时遇到了一些问题。

我目前正在学习 Java,并且一直在通过过去的试卷来帮助建立我的 Java 知识。

问题来了:

编写一个 Account 类,其中包含帐号和当前余额的实例变量。实现构造函数和方法 getAccountNumber()、getBalance()、debit(double amount) 和 credit(double amount)。在您的借记卡和贷记卡实现中,检查指定金额是否为正数,以及在借记卡方法中不会导致透支。在这些情况下返回 false。否则,更新余额。

我已经尝试过这样做,但是,我还没有为借方和贷方方法实现布尔函数。我只是想先构建程序并尝试让它工作。之后我打算看看这个,因为我不确定如何返回 true 或 false,同时还试图从上述方法返回一个金额。

由于我还在学习 Java,请原谅我的代码中的任何错误。

我可以运行我的代码,但是当我输入存款时,它似乎无法正常工作,我将不胜感激。

这是我的代码:

import java.util.*;

public class Account {

private int accountNumber;
private static double currentBalance;
private static double debit;

// ***** CONSTRUCTOR *****//
public Account(double currentBalance, int accountNumber) {
    accountNumber = 12345;
    currentBalance = 10000.00;
}

public int getAccountNumber(int accountNumber) {
    this.accountNumber = accountNumber;
    return accountNumber;
}

public double getcurrentBalance(double currentBalance) {
    this.currentBalance = currentBalance;
    return currentBalance;
}

public static double debit(double currentBalance, double amount) {
    currentBalance -= amount;
    return currentBalance;
}

public static double credit(double currentBalance, double amount) {
    currentBalance += amount;
    return currentBalance;
}

public static void main(String [] args){
    String withdraw = "Withdraw";
    String deposit = "Deposit";
    double amount;
    Scanner in = new Scanner(System.in);
    System.out.println("Are you withdrawing or depositing? ");
    String userInput = in.nextLine();
    if(userInput == withdraw)
        System.out.println("Enter amount to withdraw: ");
        amount = in.nextDouble();
            if(amount > currentBalance)
                System.out.println("You have exceeded your amount.");

                debit(currentBalance, amount);

            System.out.println("Your new balance is: " + currentBalance);

            if (userInput == deposit)
                System.out.println("Enter amount to deposit: ");
                    amount = in.nextDouble();
                    credit(currentBalance, amount);

        System.out.println("Your new balance is: " + currentBalance);

}
}

再次请原谅我的代码中的任何错误。我还在学习它的语法。

【问题讨论】:

  • 这不是python。为你的 ifs 放置括号
  • 这是一个非常糟糕的建议。
  • 您的借记和贷记方法应该返回一个布尔值。
  • @PrimalScientist 如果您只需要执行一条语句,则不需要。尽管如此,它总是建议使用它们
  • 切勿使用== 进行字符串比较。使用equals()

标签: java if-statement


【解决方案1】:

在 if 语句 if(userInput == withdraw) 中,您尝试比较 String 对象。

在 Java 中比较 String 对象时使用 equals 方法而不是比较运算符 ==

if(userInput.equals(withdraw))

代码中有几个实例使用== 比较String 对象,将它们更改为使用equals

此外,当使用条件块时,最好用大括号将块括起来{}

if(true){

}

【讨论】:

  • 这很棒。谢谢你。
  • @PrimalScientist 很高兴我能提供帮助。看起来您的代码非常整洁有序。保持!大括号也有助于使其更具可读性。
  • @PrimalScientist 你也可以使用if(userInput.equalsIgnoreCase("withdraw"))
  • 非常感谢您的反馈。我以前从未见过这种语法!
【解决方案2】:

您不使用方括号,因此仅执行 if 语句后的第一行。此外,应使用.equals(otherString) 比较字符串。像这样:

if(userInput.equals(withdraw))
    System.out.println("Enter amount to withdraw: "); //Only executed if userInput == withdraw
    amount = in.nextDouble(); //Always executed

if(userInput.equals(withdraw)) {
    System.out.println("Enter amount to withdraw: "); 
    amount = in.nextDouble(); 
    //All executed
}

这样做:

if(userInput.equals(withdraw)) {
    System.out.println("Enter amount to withdraw: ");
    amount = in.nextDouble();
    if(amount > currentBalance)
            System.out.println("You have exceeded your amount.");

    debit(currentBalance, amount);
    System.out.println("Your new balance is: " + currentBalance);
}

if (userInput.equals(deposit)) {
     System.out.println("Enter amount to deposit: ");
     amount = in.nextDouble();
     credit(currentBalance, amount);
     System.out.println("Your new balance is: " + currentBalance);
}

请注意,如果您的提款金额超过当前余额,您将收到“警告消息”,但您的提款将继续。因此,您最终会得到一笔负数的钱。如果您不想这样做,则必须相应地进行更改。但是,这种方式显示了使用括号(或不使用括号)如何产生不同的效果。

【讨论】:

  • @Joetjah 注意;在您的回答中,您仍在使用 string == 这不起作用:stackoverflow.com/questions/513832/…
  • 这太棒了,谢谢。一旦我让这部分代码工作,我将开始查看布尔值。但是,我怎样才能返回 true 或 false 的值?我发现这个问题是个好问题,但我有点困惑如何解决这个问题?
  • 嗯,你能做的只是返回一个布尔值,因为你的currentBalance 是全班的,你可以得到钱的改变。像这样:if (debit(currentBalance, amount)) { System.out.println("Your money has been decreased to " + currentBalance); } else { System.out.println("Transaction cancelled."); }
  • 如果你真的想返回2个值,你必须创建一个对象或类来封装两者。 stackoverflow.com/questions/457629/… 不过在这种情况下我不会这样做。
【解决方案3】:
if (userInput == deposit)

应该是

if (userInput.equals(deposit))

提现也一样。

【讨论】:

  • 谢谢你。这里有很大的帮助。
【解决方案4】:

关于这些方法:

public static double debit(double currentBalance, double amount) {
    currentBalance -= amount;
    return currentBalance;
}

public static double credit(double currentBalance, double amount) {
    currentBalance += amount;
    return currentBalance;
}

函数的输入实际上不应该包括当前余额,对象已经知道当前余额是什么(它保存在对象 currentBalance 字段中,正如已经指出的那样,它不应该是静态的)。

想象一台真正的提款机,其行为如下:

Whats my current balance:
£100
CreditAccount("I promise my current balance is £1 Million, it really is", £10):
Balance:£1,000,010

编辑:包含这样行为的代码

import java.util.*;

public class Account {

private int accountNumber;
private double currentBalance; //balance kept track of internally

// ***** CONSTRUCTOR *****//

    public Account(int accountNumber, double currentBalance) {
        this.accountNumber = accountNumber;
        this.currentBalance = currentBalance;
    }


    public int getAccountNumber() {
        return accountNumber;
    }

    public double getcurrentBalance() {
        return currentBalance;
    }

    public boolean debit(double amount) {
        //we just refer to the objects fields and they are changed

        if (currentBalance<amount){
            return false; //transaction rejected
        }else{
            currentBalance -= amount;
            return true;
            //transaction approaved and occured
        }

        //Note how I directly change currentBalance, there is no need to have it as either an input or an output

    }

    public void credit( double amount) {
        //credits will always go through, no need for return boolean
        currentBalance += amount;

        //Note how I directly change currentBalance, there is no need to have it as either an input or an output
    }

    public static void main(String [] args){
        Account acc=new Account(1234,1000);

        acc.credit(100);

        System.out.println("Current ballance is " + acc.getcurrentBalance());

        boolean success=acc.debit(900); //there is enough funds, will succeed

        System.out.println("Current ballance is " + acc.getcurrentBalance());
        System.out.println("Transaction succeeded: " +  success);


        success=acc.debit(900); //will fail as not enough funds

        System.out.println("Current ballance is " + acc.getcurrentBalance());
        System.out.println("Transaction succeeded: " +  success);


    }
}

我没有打扰使用键入的输入,因为您似乎掌握了窍门

【讨论】:

  • 非常感谢您的反馈。不过,我还能如何修改 currentBalance 变量?还是会通过退回金额自动执行此操作?
  • @PrimalScientist 我已经更新了我的答案以作为示例回答,但基本上非静态方法可以访问该类的任何非静态字段(即任何帐户方法都可以访问 accountNumber 和 currentBalance)。这是面向对象代码的基本原则之一
  • 是的,我现在看到了。快速提问 Richard,您在这里创建了一个新对象:Account acc=new Account(1234,1000);所以这是帐号和银行的金额。我还可以修改代码以获取用户输入并进行相应修改。
  • 当然,最明智的方法可能是向用户询问该信息,然后使用构造函数创建对象。但是您同样可以创建一个空白构造函数,然后他们将信息一块一块地提供给它。选择是你的,但它通常被认为是一个对象接收它在构造函数中工作所需的信息的好习惯(所以如果一个对象存在,它就可以工作,而不是“你忘记在之后调用这 3 个方法建设因此你的问题”)
【解决方案5】:

如果没有“{”和“}”,if 语句后的第一行只会作为该语句的一部分执行。此外,您的if (userInput == deposit) 块没有正确缩进,它不应该在if (userInput == withdraw) 之下。字符串比较应该使用userInput.equals(withdraw)

【讨论】:

  • 感谢您的反馈 Shane。
【解决方案6】:

对于借记和贷记方式:

public static boolean debit(double currentBalance, double amount) {
   currentBalance -= amount;
   if<currentBalance < 0){
       return false
   }
   return true;
}

public static boolean credit(double currentBalance, double amount) {
   currentBalance += amount;
   if<currentBalance > 0){
       return false
   }
   return true;
}

现在我想我把布尔值弄混了。描述有点不清楚每种方法返回什么。

【讨论】:

    【解决方案7】:

    使用 equals() 方法代替 == 比较 Objetcs 的相等性而不是值

    import java.util.*;
    
    public class Account{
    
    private int accountNumber;
    private static double currentBalance;
    private static double debit;
    
    // ***** CONSTRUCTOR *****//
    public Account(double currentBalance, int accountNumber) {
        accountNumber = 12345;
        currentBalance = 10000.00;
    }
    
    public int getAccountNumber(int accountNumber) {
        this.accountNumber = accountNumber;
        return accountNumber;
    }
    
    public double getcurrentBalance(double currentBalance) {
        this.currentBalance = currentBalance;
        return currentBalance;
    }
    
    public static double debit(double currentBalance, double amount) {
        currentBalance -= amount;
        return currentBalance;
    }
    
    public static double credit(double currentBalance, double amount) {
        currentBalance += amount;
        return currentBalance;
    }
    
    public static void main(String [] args){
        String withdraw = "Withdraw";
        String deposit = "Deposit";
        double amount;
        Scanner in = new Scanner(System.in);
        System.out.println("Are you withdrawing or depositing? ");
        String userInput = in.nextLine();
        if(userInput.equals(withdraw))
            System.out.println("Enter amount to withdraw: ");
            amount = in.nextDouble();
                if(amount > currentBalance)
                    System.out.println("You have exceeded your amount.");
    
                    debit(currentBalance, amount);
    
                System.out.println("Your new balance is: " + currentBalance);
    
                if (userInput .equals(deposit))
                    System.out.println("Enter amount to deposit: ");
                        amount = in.nextDouble();
                        credit(currentBalance, amount);
    
            System.out.println("Your new balance is: " + currentBalance);
    
    }
    }
    

    【讨论】:

    • 非常感谢。我可以看到那里的修改。很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2014-08-27
    • 2021-09-24
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多