2014-11-06 3 views
-2

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

import java.util.Scanner; 
 
public class Proj3 
 
{ 
 
    public static void main (String []args) 
 
    { 
 
     BankAccount cust1 = new Proj3().createAccount(); 
 
     BankAccount cust2 = new Proj3().createAccount(); 
 
     BankAccount cust3 = new Proj3().createAccount(); 
 
     
 
       
 
    } 
 
    
 
    public BankAccount createAccount() 
 
    { 
 
     Scanner kb = new Scanner (System.in); //input for Strings 
 
     Scanner kb2 = new Scanner (System.in); //input for numbers 
 
     String strName;       //Holds account name 
 
     String strAccount;      //Holds account number 
 
     String strResponse;      //Holds users response to account creation 
 
     double dDeposit;      //Holds intial deposit into checking 
 
     BankAccount b1; 
 
     
 
     
 
     
 
     
 
     { 
 
      System.out.print ("\nWhat is the name of the account? "); 
 
      strName = kb.nextLine(); 
 
      b1.setName(strName); 
 
      while (strName.length()==0) 
 
      { 
 
       System.out.print ("\nPlease input valid name."); 
 

 
       System.out.print ("\nWhat is the name of the account?"); 
 
       strName = kb.nextLine(); 
 
      } 
 

 
     System.out.print ("Would you like to create this account? (Y or N)"); 
 
     strResponse = kb.nextLine(); 
 
     strResponse = strResponse.toUpperCase(); 
 

 
     if (strResponse.equals("Y")) 
 
     { 
 
      BankAccount b1 = new BankAccount(strName, strAccount, dDeposit); 
 
     } 
 
     else 
 
     { 
 
      b1 = null; 
 
     }

и у меня есть класс BankAccount, который выглядит примерно так:

import java.util.Scanner; 
 

 
public class BankAccount 
 
{ 
 
    private String name;      //Holds name of customer 
 
    private String account;     //Holds account number of 
 
    private double checkingAccount;   //Holds balance for checking 
 
    private double savingsInterestRate;  //Holds annual interest rate on savings 
 
    private double savingsAccount;    //Holds balance for savings 
 
    private int savingsDays;     //Holds days for calc. savings interest 
 
    private double totalEarnedInterest;  //Holds total interest earned 
 
    
 
    public BankAccount (String name, String account, double amount) 
 
    { 
 
     setName(name); 
 
     setAccount(account); 
 
     setChecking(amount); 
 
    } 
 
    
 
    public void setName (String name) 
 
    { 
 
     this.name = name; 
 
    }

Как передать все введенные пользователем данные в их корр. ответы на вопросы в моем классе BankAccount? В конце я хотел бы использовать метод toString для отображения всей информации на экране.

Я знаю, проблема b1.setName(strName), потому что я не инициализировал b1, но как бы я это сделал? Любая помощь в этом вопросе была бы весьма признательна.

+1

Может быть, я недоразумение, но не вы уже делаете, что здесь: 'BankAccount b1 = новый BankAccount (strName, strAccount, dDeposit)'? –

+0

@PaulRichter Но он вызывает setName по нулевой ссылке выше. Почему вы звоните в сеттер? Почему бы просто не удалить эту строку? – thatidiotguy

+1

Вы вызываете setName() дважды ... один раз на неинициализированный экземпляр BankAccount (который выдает NullPointer) и второй раз, когда вы передаете String в конструктор. Вы уже делаете то, что вы просите иначе, теперь вам просто нужно написать метод toString и распечатать переменные класса. – proulxs

ответ

0

Вы вызываете метод setName BankAcound перед созданием объекта. Вызов setName не нужен, поскольку вы передаете strName в конструктор.

+0

Я хотел спросить у них их имя и номер счета, и если они хотели создать учетную запись. Это создало бы новую учетную запись для них, используя их информацию, которую они вводили. Если они не хотят создавать учетную запись, это приведет к возврату null. – ph0bolus

0

Самый простой способ - передать аргументы в свой конструктор BankAccount и назначить переменные-члены. Вам не нужно вызывать методы setter внутри конструктора.

public BankAccount(String name, String account, double amount) { 
    this.name = name; 
    this.account = account; 
    this.amount = amount; 
} 

Таким образом, это нормально, если у вас есть несколько аргументов, но если вы хотите, чтобы передать все свои свойства банковского счета в конструктор в списке аргументов, то код будет некрасиво и непонятным. Легко менять параметры вызова по ошибке, если они одного типа.

Более элегантный подход заключается в использовании плавного шаблона построения интерфейса, as described here. Затем создать объект банковского счета будет выглядеть примерно так:

BankAccount b1 = BankAccountBuilder.newBankAccount 
      .witName(strName) 
      .withAccountNumber(strAccount) 
      .havingAmount(dDeposit) 
      .withSavingDays(days) 
      .build();