Java не читает переменную, которую я передаю ей после того, как пользователь ее изменил - PullRequest
1 голос
/ 31 августа 2011

У меня действительно длинная проблема. Я создаю банковский счет и устанавливаю баланс на 0. Если пользователь решит снять или внести деньги на счет, баланс никогда не изменится. Я выбираю показ баланса, и он все еще говорит 0. Это, вероятно, ежу понятно, но я потрачен прямо сейчас. Вот мой длинный код (оператор switch находится в моем основном классе, а методы в объектном классе):

public class MyProgram2{
public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    Scanner input = new Scanner (System.in);
    String menu, outputString, poo;
    int option = 1;
    int id = 0;
    double balance = 0, amount = 0;
    Account acc = new Account();


    menu ="\n\t1  Create Account and ID" + 
            "\n\t2  Check balance" +
            "\n\t3  Withdraw" +
            "\n\t4  Deposit" + 
            "\n\t5  Get account ID" +
            "\n\t6  Display Account Info" +

            "\n\t0  Quit\n\n\n";

    System.out.println(menu);
    System.out.println("\tEnter your selection:  ");
    option = scan.nextInt();

    while (option != 0) {

            switch (option) {

            case 1: //Create an account and set ID
                        System.out.print("Enter Your Account ID to create account:\t");
                        id = input.nextInt();
                        System.out.println("Account created!");
                        break;

            case 2:     //check balance
                        acc.checkBalance(balance);
                        break;

            case 3:     //withdraw money
                        acc.withdraw(balance, amount);
                        break;

            case 4: //deposit money
                        acc.deposit(balance, amount);
                        break;

            case 5:     //get account id
                        acc.getID(id);
                        break;

            case 7:     //display account info
                        System.out.print("option 7");
                        break;

            default: outputString = "\nInvalid Selection\n";
                        System.out.println(outputString);
                        break;

        }
    System.out.println(menu);
    System.out.print("\tEnter your selection:   ");
    option = scan.nextInt();    
    }

И вот методы, которые я вызываю:

public class Account{
Scanner input = new Scanner (System.in);

public Account(){
}

public void getID(int id){
    System.out.println("Your account ID is:\t" + id);
}

public void checkBalance(double balance){
    System.out.println("Your balance is:\t$" + balance);
}

public double withdraw(double amount, double balance){
    System.out.println("How much do you want to withdraw?:\t$");
    amount = input.nextDouble();
    balance -= amount;
    return balance;
}

public double deposit(double amount, double balance){
    System.out.println("How much do you want to deposit?:\t");
    amount = input.nextDouble();
    balance += amount;
    return balance;
}

public void getAccountInfo(int id, double balance){

}
}

Ответы [ 3 ]

5 голосов
/ 31 августа 2011

Переменная

double balance
не может быть передана как ссылка.Он делает копию, поэтому, когда вы пытаетесь манипулировать ею, это не повлияет на оригинал, который вы передаете в качестве аргумента.Вам необходимо обновить значение, используя возвращаемое значение, которое есть в функции.

Для того, чтобы оно работало, вы должны выполнить:


case 4: //deposit money

// note here that you need to update the balance variable using the return value that
// you put in the function
balance = acc.deposit(balance, amount);
break;

Примечание : Ваш дизайн, отделяющий баланс от класса Account, не идеален для ответа @ Psyrus.Вы должны сохранить баланс как часть класса Account.Причина в том, что баланс является частью учетной записи, и если ваша программа будет обрабатывать несколько учетных записей (только для примера), отделение переменного баланса от учетной записи создаст головную боль при обслуживании (представьте, что с двумя экземплярами учетной записи вы будетеиметь переменные balance1 и balance2 (или как вы это называете) в MyProgram2, главном приложении).Хотя я и объяснил причину вашей проблемы с передачей переменных, вы должны рефакторинг вашего кода, следуя предложению @Psyrus.

3 голосов
/ 31 августа 2011

У вас настроен весь класс учетной записи, но в нем нет фактической переменной баланса. Переместите эту переменную из вашей программы в ваш класс, и она должна работать. Посмотрев дальше, вы как бы перепутали биты между ними, поэтому сделайте это:

public class MyProgram2{
  public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    Scanner input = new Scanner (System.in);
    String menu, outputString, poo;
    int option = 1;
    int id = 0;
    Account acc = new Account();


    menu ="\n\t1  Create Account and ID" + 
        "\n\t2  Check balance" +
        "\n\t3  Withdraw" +
        "\n\t4  Deposit" + 
        "\n\t5  Get account ID" +
        "\n\t6  Display Account Info" +

        "\n\t0  Quit\n\n\n";

    do {

      System.out.println(menu);
      System.out.println("\tEnter your selection:  ");
      option = scan.nextInt();

      switch (option) {

        case 1: //Create an account and set ID
        System.out.print("Enter Your Account ID to create account:\t");
        id = input.nextInt();
        System.out.println("Account created!");
        break;

        case 2:     //check balance
        acc.checkBalance();
        break;

        case 3:     //withdraw money
        acc.withdraw();
        break;

        case 4: //deposit money
        acc.deposit();
        break;

        case 5:     //get account id
        acc.getID(id);
        break;

        case 7:     //display account info
        System.out.print("option 7");
        break;

        default: outputString = "\nInvalid Selection\n";
        System.out.println(outputString);
        break;

      }
    } while (option != 0);
  }
}

public class Account{

  Scanner scan = new Scanner(System.in);
  Scanner input = new Scanner (System.in);    double balance = 0;

  public Account(){
  }

  public void getID(id){
    System.out.println("Your account ID is:\t" + id);
  }

  public void checkBalance(){
    System.out.println("Your balance is:\t$" + balance);
  }

  public double withdraw(){
    System.out.println("How much do you want to withdraw?:\t$");
    double amount = input.nextDouble();
    balance -= amount;
  }

  public double deposit(){
    System.out.println("How much do you want to deposit?:\t");
    double amount = input.nextDouble();
    balance += amount;
    return balance;
  }

  public void getAccountInfo(int id, double balance){

  }
}

Это один из способов сделать это, но, как я уже сказал, ваш дизайн - нечто среднее между классами. Вы должны попытаться сохранить все свойства объекта в этом классе и создать функции для этого класса для получения / изменения свойств. Печать для пользователя должна содержаться в классе, отвечающем за предоставление пользователю интерфейса.

Редактировать: Упс забыл время в конце цикла do while ...

2 голосов
/ 31 августа 2011

Вам просто нужно изменить созданный вами экземпляр следующим образом:

public double deposit(){
    System.out.println("How much do you want to deposit?:\t");
    this.amount = input.nextDouble();
    this.balance += amount;
    return balance;
}

this keyword относится к объекту, вызывающему этот метод, в этом случае acc, поэтому this.amount изменит amount для этого экземпляра.

В вашем текущем коде вы просто изменяете local variables.

Вам также необходимо обновить класс учетной записи, чтобы иметь атрибуты количества и баланса:

public class Account{
Scanner input = new Scanner (System.in);
double balance = 0, amount = 0;
...