2015-11-26 45 views
1

我是一個堆棧溢出的新用戶..好吧,我正在做一個ATM Java程序..我的問題是,我很難試圖弄清楚如何使一個文件閱讀器(我的是customers.txt)在我ATMSimulator.java ..ATM機的customers.txt文件

這裏是我的ATM.java

/* 
An ATM that accesses a bank. 
*/ 

public class ATM 
{ 
public static final int CHECKING = 1; 
public static final int SAVINGS = 2; 

private int state; 
private int customerNumber; 
private Customer currentCustomer; 
private BankAccount currentAccount; 
private Bank theBank; 

public static final int START = 1; 
public static final int PIN = 2; 
public static final int ACCOUNT = 3; 
public static final int TRANSACT = 4; 

/* 
    Construct an ATM for a given bank. 
    @param aBank the bank to which this ATM connects 
*/ 

public ATM (Bank aBank) 
{ 
    theBank = aBank; 
    reset(); 
} 

/* 
    Resets the ATM to the initial state 
*/ 

public void reset() 
{ 
    customerNumber = -1; 
    currentAccount = null; 
    state = START; 
} 

/* 
    Sets the current customer number and sets state to PIN. 
    (Precondition: state is START) 
    @param number the customer number 
*/ 

public void setCustomerNumber (int number) 
{ 
    assert state == START; 
    customerNumber = number; 
    state = PIN; 
} 

/* 
    Finds customer in bank. If found, sets state to ACCOUNT, else to START 
    (Precondition: state is PIN) 
    @param pin the PIN of the current customer 
*/ 

public void selectCustomer (int pin) 
{ 
    assert state == PIN; 
    currentCustomer = theBank.findCustomer (customerNumber, pin); 

    if (currentCustomer == null) 
     state = START; 
    else 
     state = ACCOUNT; 
} 

/* 
    Sets current account to checking or savings. Sets state to TRANSACT. 
    (Precondition: state is ACCOUNT or TRANSACT) 
    @param account one of CHECKING or SAVINGS 
*/ 

public void selectAccount (int account) 
{ 
    assert state == ACCOUNT || state == TRANSACT; 

    if (account == CHECKING) 
     currentAccount = currentCustomer.getCheckingAccount(); 
    else 
     currentAccount = currentCustomer.getSavingsAccount(); 
    state = TRANSACT; 
} 

/* 
    Withdraws amount from current account. 
    (Precondition state is TRANSACT) 
    @param value the amount to withdraw 
*/ 

public void withdraw (double value) 
{ 
    assert state == TRANSACT; 
    currentAccount.withdraw(value); 
} 

/* 
    Deposits amount to current account. 
    (Prcondition: state is TRANSACT) 
    @param value the amount to deposit 
*/ 

public void deposit (double value) 
{ 
    assert state == TRANSACT; 
    currentAccount.deposit (value); 
} 

/* 
    Gets the balance of the current account. 
    (Precondition: state is TRANSACT) 
    @return the balance 
*/ 

public double getBalance() 
{ 
    assert state == TRANSACT; 
    return currentAccount.getBalance(); 
} 

/* 
    Moves back to previous state 
*/ 

public void back() 
{ 
    if (state == TRANSACT) 
     state = ACCOUNT; 
    else if (state == ACCOUNT) 
     state = PIN; 
    else if (state == PIN) 
     state = START; 
} 

/* 
    Gets the current state of this ATM. 
    @return the currnt state 
*/ 

public int getState() 
{ 
    return state; 
} 
} 

這裏是我的Customer.java

/* 
A bank customer with a checking and a savings account. 
*/ 

public class Customer 
{ 
private int customerNumber; 
private int pin; 
private BankAccount checkingAccount; 
private BankAccount savingsAccount; 

/* 
    Construct a customer with a given number and PIN. 
    @param aNumber the customer number 
    @param aPin the personal identification number 
*/ 

public Customer (int aNumber, int aPin) 
{ 
    customerNumber = aNumber; 
    pin = aPin; 
    checkingAccount = new BankAccount(); 
    savingsAccount = new BankAccount(); 
} 

/* 
    Test if this customer matches a customer number and PIN 
    @param aNumber a customer number 
    @param aPin a personal identification number 
    @return true if the customer number and PIN match 
*/ 

public boolean match (int aNumber, int aPin) 
{ 
    return customerNumber == aNumber && pin == aPin; 
} 

/* 
    Gets the checking account of this customer 
    @return the checking account 
*/ 

public BankAccount getCheckingAccount() 
{ 
    return checkingAccount; 
} 

/* 
    Get the savings account of this customer 
    @return checking account 
*/ 

public BankAccount getSavingsAccount() 
{ 
    return savingsAccount; 
} 
} 

這裏是我的Bank.java

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Scanner; 

/* 
A bank contains customer with bank accounts 
*/ 

public class Bank 
{ 
private ArrayList<Customer> customers; 

/* 
    Construct a bank with no customers 
*/ 

public Bank() 
{ 
    customers = new ArrayList<Customer>(); 
} 

/* 
    Reads the customer numbers and pins 
    and initializes the bank accounts 
    @param filename the name of the customer file 
*/ 

public void readCustomers(String filename) 
    throws IOException 
{ 
    Scanner in = new Scanner (new File(filename)); 

    while (in.hasNext()) 
    { 
     int number = in.nextInt(); 
     int pin = in.nextInt(); 
     Customer c = new Customer (number, pin); 
     addCustomer (c); 
    } 
    in.close(); 
} 

/* 
    Adds a customer to the bank. 
    @param c the customer to add 
*/ 

public void addCustomer (Customer c) 
{ 
    customers.add(c); 
} 

/* 
    Find a customer in the bank. 
    @param aNumber a customer number 
    @param aPin a personal identification number 
    @return the matching customer, or null if no customer matches 
*/ 

public Customer findCustomer (int aNumber, int aPin) 
{ 
    for (Customer c : customers) 
    { 
     if (c.match(aNumber, aPin)) 
      return c; 
    } 
    return null; 
} 
} 

這裏是我的BankAccount.java

/** 
A bank account has a balance that can be changed by deposits and withdrawals 
*/ 
public class BankAccount 
{ 
private int accountNumber; 
private double balance; 

/** 
    Counstruct a bank account with a zero balance. 
    @param anAccountNumber the account number for this account 
*/ 

public BankAccount(){} 


public BankAccount(int anAccountNumber) 
{ 
    accountNumber = anAccountNumber; 
    balance = 0; 
} 

/** 
    Construct a bank account with a given balance. 
    @param anAccountNumber the account number for this account 
    @param initialBalance the initial balance 
*/ 
public BankAccount(int anAccountNumber, double initialBalance) 
{ 
    accountNumber = anAccountNumber; 
    balance = initialBalance; 
} 

/** 
    Gets the account number of this bank account. 
    @return the account number 
*/ 
public int getAccountNumber() 
{ 
    return accountNumber; 
} 

/** 
    Deposits money into bank account 
    @param amount the amount to deposit 
*/ 
public void deposit (double amount) 
{ 
    double newBalance = balance + amount; 
    balance = newBalance; 
} 

/** 
    Withdraws money from the bank account. 
    @param amount the amount to withdraw 
*/ 
public void withdraw(double amount) 
{ 
    double newBalance = balance - amount; 
    balance = newBalance; 
} 

/** 
    Gets the current balance of the bank account. 
    @return the current balance 
*/ 
public double getBalance() 
{ 
    return balance; 
} 
} 

,我有與customers.txtATMSimulator.java一個問題:

import java.io.IOException; 
import java.util.Scanner; 

/* 
    A text based simulation of an automatic teller machine. 
*/ 

public class ATMSimulator 
{ 
    public static void main (String [] args) 
{ 
    ATM theATM; 

    try 
    { 
     Bank theBank = new Bank(); 
     theBank.readCustomers("customers.txt"); 
     theATM = new ATM (theBank); 
    } 

    catch (IOException e) 
    { 
     System.out.println ("Error opening accounts file."); 
     return; 
    } 

    Scanner in= new Scanner (System.in); 

    while (true) 
    { 
     int state = theATM.getState(); 
     if (state == ATM.START) 
     { 
      System.out.print ("Enter customer number: "); 
      int number = in.nextInt(); 
      theATM.setCustomerNumber(number); 
     } 

     else if (state == ATM.PIN) 
     { 
      System.out.println ("Enter PIN: "); 
      int pin = in.nextInt(); 
      theATM.setCustomerNumber (pin); 
     } 

     else if (state == ATM.ACCOUNT) 
     { 
      System.out.print ("A = Checking, B = Savings, C = Quit: "); 
      String command = in.next(); 

      if (command.equalsIgnoreCase ("A")) 
       theATM.selectAccount (ATM.CHECKING); 
      else if (command.equalsIgnoreCase ("B")) 
       theATM.selectAccount (ATM.SAVINGS); 
      else if (command.equalsIgnoreCase ("C")) 
       theATM.reset(); 
      else 
       System.out.println ("Illegal input!"); 
     } 

     else if (state == ATM.TRANSACT) 
     { 
      System.out.println ("Balance = " + theATM.getBalance()); 
      System.out.print ("A = Deposit, B = Withdrawal, C = Cancel: "); 
      String command = in.next(); 

      if (command.equalsIgnoreCase ("A")) 
      { 
       System.out.print ("Amount: "); 
       double amount = in.nextDouble(); 
       theATM.deposit (amount); 
       theATM.back(); 
      } 

     else if (command.equalsIgnoreCase ("B")) 
     { 
      System.out.print ("Amount: "); 
      double amount = in.nextDouble(); 
      theATM.withdraw (amount); 
      theATM.back(); 
     } 

     else if (command.equalsIgnoreCase ("C")) 
      theATM.back(); 

     else 
      System.out.println ("Illegal input!"); 
     } 
    } 
} 
} 

我創造customers.txt文件,但輸出錯誤 ..請幫我

+3

和錯誤是? – Atri

+0

它將打印「錯誤打開帳戶文件。」 如果我創建customers.txt文件,它將顯示java.util.InputMismatchException – Lufiii

+0

如果您將該錯誤作爲問題的主要觀點,那將會很有幫助。 – Atri

回答

0

我會解決你的問題不是sh ..大量的代碼。

以這種方式有效地從文件讀取。

try(BufferedReader br = new BufferedReader(new FileReader("filename.txt"))){ 
    String line; 
    while((line = br.readLine()) != null){ 

    } 
}catch(IOException e}{ 
    e.printStackTrace(); 
} 

如果你想從控制檯讀取:

try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in))){ 
    String line; 
    while((line = br.readLine()) != null){ 

    } 
}catch(IOException e}{ 
    e.printStackTrace(); 
} 

以表示輸入在控制檯中使用ctrl + z結束。

+0

對不起,先生,我不明白..對於我的情況,如何使「filename.txt」? – Lufiii

+0

@Lufiii請給出您獲得的例外堆棧,並在您的代碼中標記您獲得的地方,例如通過評論//例外。這將有很大幫助。 – Yoda

+0

異常在線程 「主」 java.util.InputMismatchException \t在java.util.Scanner.throwFor(Scanner.java:864) \t在java.util.Scanner.next(Scanner.java:1485)在java的 \t .util.Scanner.nextInt(Scanner.java:2117) \t at java.util.Scanner.nextInt(Scanner。java:2076) \t at Bank.readCustomers(Bank.java:37) \t at ATMSimulator.main(ATMSimulator.java:17) – Lufiii

0

嘿所以您在readCustomer方法中傳遞的文本文件的路徑不是正確的路徑。所以,你可以做什麼放在src和包名路徑如下:「SRC /包/ customer.txt」

所以當你把它在你的主那將是

public static void main (String [] args) 
{ 
    ATM theATM; 

    try 
    { 
     Bank theBank = new Bank(); 
     theBank.readCustomers("src/packageName/customer.txt"); 
     theATM = new ATM (theBank); 
    } 

希望這有助於。