java - 变量赋值问题

标签 java

我正在创建一个项目,允许用户执行您通常在银行可以执行的操作(创建、删除帐户、取款、存款、打印交易)。

我的问题是打印交易。我能够打印一些东西,但出现了错误的值。例如,当您创建一个银行账户时,您需要输入期初余额 (5.00)。当我打印交易时,什么也没有出现。所以我将钱存入同一帐户 (10.00),当我打印时,之前的 (5.00) 出现并且 (10.00) 出现在交易日期中。但是,当我查看帐户余额时,所有内容加起来就是显示的内容。

有人可以帮我排查和解决问题吗?

package mainsample;
import java.util.*;

public class Main {


    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        BankProcess bankProcess = new BankProcess();
        TransactionProcess transactionProcess = new TransactionProcess();


    Bank bank = new Bank();
    BankAccount bankAccount = new BankAccount();

    int input;
    int selection;

    while(true) {
      System.out.println(""); 
      System.out.println("######## MENU ########");
      System.out.println("[1] Create an account");
      System.out.println("[2] Print all existing accounts");
      System.out.println("[3] Delete an account");
      System.out.println("[4] Deposit");
      System.out.println("[5] Withdraw");
      System.out.println("[6] Print transactions");
      System.out.println("[0] Exit");      
      System.out.println("######################");
      System.out.println("Please choose one of the following: ");
      selection = scan.nextInt();

      switch (selection) {

        case 0:
          System.out.println("Exit Successful");
          System.exit(0);
            break;

        case 1:
          System.out.println("'[1] Create an account' has been selected.");
          System.out.print("Account Id: ");
          int accountId = scan.nextInt();
          scan.nextLine();

          System.out.print("Holder Name: ");
          String holderName = scan.nextLine();

          System.out.print("Holder Address: ");
          String holderAddress = scan.nextLine();

          System.out.print("Opening Balance: ");
          double openingBalance = scan.nextDouble();

          System.out.print("Open Date: ");

          String openDate = scan.next();

          bankAccount = new BankAccount(accountId, holderName, openingBalance, holderAddress, openDate);
          bank.setAccounts(bankProcess.openNewAccount(bank.getAccounts(), bankAccount));

          System.out.println("Successfully Added.");
          break;      

        case 2:
          System.out.println("'[2] Display all existing accounts' has been selected");
          System.out.println("-----------------------------------------------------");
            bank.getAccounts().forEach((i,b)->System.out.println(b));
          System.out.println("-----------------------------------------------------");
            break;

        case 3:
            System.out.println("[3] Delete an account has been selected");
            System.out.println("Enter the account ID: ");
            int accountNo = scan.nextInt();
            bankAccount = bank.getAccount(accountNo); // get bankAccount from account id
            bank.removeAccounts(bankProcess.removeAccount(bank.getAccounts(), bankAccount));
            System.out.println("Account has been deleted.");
      break;

        case 4:
            System.out.println("[4] Deposit has been selected");
            System.out.println("Enter account ID: ");
            int accountNumber =  scan.nextInt(); 

            System.out.println("Enter deposit amount: ");
            double depositAmount = scan.nextDouble();           

            transactionProcess.deposit(bankAccount, depositAmount);


            break;

        case 5:
            System.out.println("[5] Withdraw has been selected");
            System.out.println("Enter account ID: ");
            int accountNu =  scan.nextInt(); 

            System.out.println("Enter withdraw amount: ");
            double withdrawAmount = scan.nextDouble();           

            transactionProcess.withdraw (bankAccount, withdrawAmount);           

            break;           


        case 6:
            System.out.println("[6] Print Transaction has been selected");
            System.out.println("Enter account ID: ");
            int accountN = scan.nextInt();
            bankAccount = bank.getAccount(accountN);
            for (Transaction transaction: bankAccount.getTransactions()) {
            // print transaction information ...
            System.out.println(transaction.toString());

}



            break;






        default:
          System.out.println("Your choice was not valid!");

      }

    }
  }
}
package mainsample;

/**
 *
 * @author Khalid
 */
public class Transaction {


  private String transactionType;
  private double transactionAmount;
  private int transactionDate;


  public Transaction() {}

  public Transaction( String transactionType, double transactionAmount, int transactionDate) {

    this.transactionType = transactionType;
    this.transactionAmount = transactionAmount;
    this.transactionDate = transactionDate;

  }

  public int getTransactionDate() {
      return transactionDate;
  }

  public void setTransactionDate (int transactionDate) {
      this.transactionDate = transactionDate;
  }


  public String getTransactionType() {
    return transactionType;
  }

  public void setTransactionType(String transactionType) {
    this.transactionType = transactionType;
  }

  public double getTransactionAmount() {
    return transactionAmount;
  }

  public void setTransactionAmount(double transactionAmount) {
    this.transactionAmount = transactionAmount;
  }

  //Override the toString() method of String ? 
  public String toString() {
    return "\nTransaction Amount : "+ this.transactionAmount +
           "\nTransaction Type : " + this.transactionType +
           "\nTransaction Date:  " + this.transactionDate;

  }

}
package mainsample;
/**
 *
 * @author Khalid
 */
public class TransactionProcess {

    public void deposit(BankAccount bankAccount, double depositAmount) {
    //Get the CurrentBalance
    double currentBalance = bankAccount.getCurrentBalance();

    //First Argument : set the Id of transaction
    //Second Argument : set the Type of Transaction
    //Third Argument : set the TransactionAmount 
    //Fourth Argument : set the Balance Before the transaction (for record purposes)
    Transaction transaction = new Transaction("Deposit", currentBalance, (int) depositAmount);

    if (depositAmount <= 0) {
      System.out.println("Amount to be deposited should be positive");
    } else {
      //Set the updated or transacted balance of bankAccount.
      bankAccount.setCurrentBalance(currentBalance + depositAmount);
      //then set the MoneyAfterTransaction

      bankAccount.addTransaction(transaction);    // adds a transaction to the bank account
      System.out.println(depositAmount + " has been deposited.");
    }

  }

  // Explanation same as above
  public void withdraw(BankAccount bankAccount, double withdrawAmount) {
    double currentBalance = bankAccount.getCurrentBalance();
    Transaction transaction = new Transaction("Withdraw", currentBalance, (int) withdrawAmount);

    if (withdrawAmount <= 0) {
      System.out.println("Amount to be withdrawn should be positive");
    } else {
      if (currentBalance < withdrawAmount) {
        System.out.println("Insufficient balance");
      } else {
        bankAccount.setCurrentBalance(currentBalance - withdrawAmount);        
        bankAccount.addTransaction(transaction);    // adds a transaction to the bank account
        System.out.println(withdrawAmount + " has been withdrawed,");
      }
    }
  }
}

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package mainsample;
import java.util.*;
/**
 *
 * @author Khalid
 */
public class BankAccount {
    private int accountId;
    private String holderName;
    private String holderAddress;
    private String openDate;
    private double currentBalance;

    private List<Transaction> transactions = new ArrayList<Transaction>();

    //Provide Blank Constructor
    public BankAccount(){}

    //Constructor with an arguments.
    public BankAccount(int accountNum, String holderNam,double currentBalance, String holderAdd,String openDate) {
            this.accountId = accountNum;
            this.holderName = holderNam;
            this.holderAddress = holderAdd;
            this.openDate = openDate;
            this.currentBalance = currentBalance;
    }

    // Always Provide Setter and Getters
    public int getAccountId() {
        return accountId;
    }
    public void setAccountId(int accountId) {
        
         this.accountId = accountId;                  
    }
    public String getHolderName() {
        return holderName;
    }
    public void setHolderName(String holderName) {
        this.holderName = holderName;
    }
    public String getHolderAddress() {
        return holderAddress;
    }
    public void setHolderAddress(String holderAddress) {
        this.holderAddress = holderAddress;
    }
    public String getOpenDate() {
        return openDate;
    }
    public void setOpenDate(String openDate) {
        this.openDate = openDate;
    }
    
    public double getCurrentBalance() {
        return currentBalance;
    }
    public void setCurrentBalance(double currentBalance) {
        this.currentBalance = currentBalance;
    }

    public List<Transaction> getTransactions() {
        return transactions;
    }

    public void setTransactions(List<Transaction> transactions) {
        this.transactions = transactions;
    }
    
    public void addTransaction(Transaction transaction){
      if(transactions.size() >= 6){  // test if the list has 6 or more transactions saved 
      transactions.remove(0);     // if so, then remove the first (it's the oldest)
     }
     transactions.add(transaction); // the new transaction is always added, no matter how many other transactions there are already in the list
     }

    public String toString(){
        return "\nAccount number: " + accountId + 
                "\nHolder's name: " + holderName + 
                "\nHolder's address: " + holderAddress + 
                "\nOpen Date: " + openDate + 
                "\nCurrent balance: " + currentBalance;
    }

   
}

package mainsample;
import java.util.*;
/**
 *
 * @author Khalid
 */
public class Bank {
    
    private TreeMap<Integer,BankAccount> bankAccounts = new TreeMap<Integer,BankAccount>();

 
    
    public TreeMap<Integer, BankAccount> getAccounts() {
        return bankAccounts;
    }
    public void setAccounts(TreeMap<Integer, BankAccount> accounts) {
        this.bankAccounts = accounts;
    }
    
     public BankAccount getAccount(Integer accountNumber){
     return bankAccounts.get(accountNumber);
     }

    
    public void removeAccounts(TreeMap<Integer, BankAccount> accounts) {
        this.bankAccounts = accounts;
    }

   
}

package mainsample;
import java.util.*;
/**
 *
 * @author Khalid
 */
public class BankProcess {
    // return the  Updated list of BankAccounts
    public TreeMap<Integer,BankAccount> openNewAccount(TreeMap<Integer,BankAccount> bankAccounts,BankAccount bankAccount) {
        //Get the List of existing bank Accounts then add the new BankAccount to it.
        bankAccounts.put(bankAccount.getAccountId(), bankAccount);        
        return bankAccounts;
    }
    
    public TreeMap<Integer,BankAccount> removeAccount(TreeMap<Integer,BankAccount> bankAccounts,BankAccount bankAccount) {
      bankAccounts.remove(bankAccount.getAccountId(), bankAccount);
      return bankAccounts;  
        
    }
    

    

}

最佳答案

首先你在Transaction constrctor中犯了一个错误

public Transaction( String transactionType, double transactionAmount, int transactionDate) {

        this.transactionType = transactionType;
        this.transactionAmount = transactionAmount;
        this.transactionDate = transactionDate;

    }

但是你是这样分配的

Transaction transaction = new Transaction("Deposit", currentBalance, (int) depositAmount);

你的论点顺序在这里完全错误。你为什么指定存款金额而不是日期。应该是这样的

Transaction transaction = new Transaction("Deposit", (int) depositAmount,date );

此外,当您创建一个新帐户时,您还没有将该金额添加到交易中。您正在使用此代码创建新帐户

bankAccount = new BankAccount(accountId, holderName, openingBalance, holderAddress, openDate);
bank.setAccounts(bankProcess.openNewAccount(bank.getAccounts(), bankAccount));

但是您还没有将这个初始金额添加到交易中。它应该包含在 bankAccount 的构造函数中

Transaction transaction = new Transaction("Deposit", 0, (int) depositAmount);

if (depositAmount <= 0) {
  System.out.println("Amount to be deposited should be positive");
} else {
  //Set the updated or transacted balance of bankAccount.
  bankAccount.setCurrentBalance(currentBalance + depositAmount);
  //then set the MoneyAfterTransaction

  bankAccount.addTransaction(transaction);    // adds a transaction to the bank account
  System.out.println(depositAmount + " has been deposited.");
}

现在我得到了正确的输出。当您创建您要求日期的帐户时。当您存款时,您没有询问日期。所以你不能为存款或取款指定交易日期

Transaction Amount : 5.0 Transaction Type : Deposit Transaction Date:  4

Transaction Amount : 10.0 Transaction Type : Deposit Transaction Date: 10

关于java - 变量赋值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27521776/

相关文章:

java - mockito, spy- 不确定部分模拟是如何完成的

java - Volley - 从onResponse获取数据

java - 在测试目录中运行主类

java - 如何从包中的每个 .java 文件创建 JAR 文件

java - java中filewriter的flush和close函数的区别

java - 为什么这段java代码没有返回任何输出?

java - 使用 RESTEasy 在服务器端接受 XML

java - 平板电脑的客户端服务器框架

java - 潜在无用的对象

java - 如何强制 MockitoJUnitRunner 在没有基本 http 身份验证的情况下失败?