• CS 61B lab6


    part one 

    在main中加上try/catch(IOException e1){}) 把两个readline包含进去即可

    bug是,当withdraw负数时:

    part two

    在findAccount函数中new throws然后每个相关函数都要throws,最后到throw到main后catch。

    part three

    把题目看仔细,说的是withdraw和deposit都有错的所以两个函数里面都要new BadTransactionException,一直throw到main再catch。

    Extra

    有两种方法:

    方法一:把catch后的readline语句移动到catch前,也就是while里try的最后。

    方法二:在catch(BadTransactionException e3){System.err.println(e3);}语句后面加上continue变成

    catch(BadTransactionException e3){System.err.println(e3);continue;)

    两种方法都可以。但是题目貌似要求moving哈哈。

    测试图片:(除了格式有点小问题,有时候exception会在repeat command后面或者不换行有时候又是正确的格式。。。并不知道为什么。。。)

     放下代码吧,发现和熊孩子的有些不同(accountData里面没有throw,都在main里catch的):

    package lab6;
    
    /* BankApp.java */
    
    import java.io.*;
    import sortedlist.*;
    
    /**
     *  A bank application.  Allows a user to create and manipulate 
     *  banking accounts, using an ATM that is shared by all banking applications.
     */
    public class BankApp {
      private BufferedReader bReader =
              new BufferedReader(new InputStreamReader(System.in));
      private VirtualTeller ATM = new VirtualTeller();
    
      public static void main(String[] args) {
        greeting();
        usage();
        BankApp bankApp = new BankApp();
        try{
        String command = bankApp.readLine("--> ");
        
        while (!command.equals("quit")) {
          try{
        if (command.equals("open")) {
          bankApp.open();
        } else if (command.equals("deposit")) {
          bankApp.doDeposit();
        } else if (command.equals("withdraw")) {
          bankApp.doWithdraw();
        } else if (command.equals("inquire")) {
          bankApp.doInquire();
        } else {
          System.err.println("Invalid command: " + command);
          usage();
        }
        command = bankApp.readLine("--> ");
        } catch(IOException e) {
        System.err.println(e);
          }
          catch(BadAccountException e2){System.err.println(e2);}
          catch(BadTransactionException e3){System.err.println(e3);}
    //      command = bankApp.readLine("--> ");  另一种方法:在catch后面加上continue
        }
       }catch(IOException e1){}
        
      }
    
      public BankApp() {
        // The field declarations have initializers;
        //   no initialization is needed here.
      }
    
      /**
       *  open() prompts the user to create an account and creates one in the ATM.
       *  @exception IOException if there are problems reading user input.
       */
      private void open() throws IOException {
        String name = readLine("Enter name: ");
        int newNum = ATM.openAccount(name);
    
        System.out.println(name + ", your new account number is: " + newNum);
        System.out.println("Thanks for opening an account with us!");
      }
    
     /**
      *  doDeposit() prompts the user for an account number and tries to perform a 
      *  deposit transaction on that account. 
      *  @exception IOException if there are problems reading user input.
      */
      private void doDeposit() throws IOException,BadAccountException,BadTransactionException{
        // Get account number.
        int acctNumber = readInt("Enter account number: ");
        int amount = readInt("Enter amount to deposit: ");
    
        ATM.deposit(acctNumber, amount);
        System.out.println("New balance for #" + acctNumber + " is " +
                           ATM.balanceInquiry(acctNumber));
      }
    
      /**
       *  doWithdraw() prompts the user for an account number and tries
       *  to perform a withdrawal transaction from that account.
       *  @exception IOException if there are problems reading user input.
       */
      private void doWithdraw() throws IOException,BadAccountException,BadTransactionException{
        // Get account number.
        int acctNumber = readInt("Enter account number: ");
        int amount = readInt("Enter amount to withdraw: ");
    
        ATM.withdraw(acctNumber, amount);
        System.out.println("New balance for #" + acctNumber + " is " +
                           ATM.balanceInquiry(acctNumber));
      }
    
      /**
       *  doInquire() prompts the user for an account number, then attempts to
       *  discover and print that account's balance.
       *  @exception IOException if there are problems reading user input.
       */
      private void doInquire() throws IOException,BadAccountException{
        int acctNumber = readInt("Enter account number: ");
    
        System.out.println("Balance for #" + acctNumber + " is " +
                           ATM.balanceInquiry(acctNumber));
      }
    
      /**
       *  greeting() displays a greeting message on the screen.
       */
      private static void greeting() {
        System.out.println("-------------------");
        System.out.println("Welcome to the bank");
        System.out.println("-------------------");
        System.out.println();
      }
    
      /**
       *  usage() displays instructions on using the command line arguments.
       */
      private static void usage() {
        System.out.println("Valid commands are: " +
                           "open, deposit, withdraw, inquire, quit");
      }
    
      /**
       *  readLine() prints the given prompt and returns a string from the
       *  input stream.
       *  @param prompt is the string printed to prompt the user.
       */
      private String readLine(String prompt) throws IOException {
        System.out.print(prompt);
        System.out.flush();
        return bReader.readLine();
      }
    
      /**
       *  readInt() returns an integer from the input stream after prompting
       *  the user.
       *  @param prompt is the string printed to prompt the user.
       *  @return an int read from the user.
       */
      private int readInt(String prompt) throws IOException {
        String text = readLine(prompt);
        return Integer.valueOf(text).intValue();
      }
    }
    BankApp
    package lab6;
    
    /*  VirtualTeller.java */
    
    import sortedlist.*;
    
    /**
     *  An implementation of a virtual automated teller machine.
     **/
    public class VirtualTeller {
      private static int nextAccountID = 100;
      private SortedList accounts;
    
      /**
       *  Constructs a new virtual teller.
       **/
      public VirtualTeller() {
        accounts = new SortedList();
      }
    
      /**
       *  openAccount() creates a new account for the customer "name".
       *  @param name the customer's name.
       *  @return the new account's ID number.
       **/
      public int openAccount(String name) {
        AccountData newData = new AccountData(name, nextAccountID);
        accounts.insert(newData);
    
        nextAccountID++;
        return newData.getNumber();
      }
    
      /**
       *  withdraw() withdraws "amount" dollars from the account whose number is
       *  "acct".  Assumes that amount >= 0.  If "acct" is invalid, no action is
       *  taken.
       *  @param acct is an account number.
       *  @param amount an amount of money.
       */
      public void withdraw(int acct, int amount) throws BadAccountException,BadTransactionException{
        AccountData account = findAccount(acct);
    
        if (account == null) {   // Didn't find the account.
          System.out.println("Error:  Couldn't find account number `" +
                             acct + "'" );
        } else {
          if(amount<0){throw new BadTransactionException(amount);}
          account.withdraw(amount);
        }
      }
    
      /**
       *  deposit() deposits "amount" dollars into the bank account whose number is
       *  "acct".  Assumes that amount >= 0.  If "acct" is invalid, no action is
       *  taken.
       *  @param acct is an account number.
       *  @param amount an amount of money.
       */
      public void deposit(int acct, int amount) throws BadAccountException,BadTransactionException{
        AccountData account = findAccount(acct);
    
        if (account == null) { 
          System.out.println("Error:  Couldn't find account number `" +
                             acct + "'");
        } else {
        if(amount<0){throw new BadTransactionException(amount);}
          account.deposit(amount);
        }
      }
    
      /**
       *  balanceInquiry() finds the balance on the account whose number is "acct".
       *  If "acct" is an invalid number, returns -1.
       *  @param acct an account number.
       *  @return the balance, or -1 if the account number is invalid.
       */
      public int balanceInquiry(int acct) throws BadAccountException{
        AccountData account = findAccount(acct);
    
        if (account == null) {
          System.out.println("Error:  Couldn't find account number `" +
                             acct + "'" );
          return -1;
        } else {
          return account.getBalance();
        }
      }
    
      /**
       *  findAccount() gets the AccountData object associated with account number
       *  "acct".  If "acct" does not refer to a valid account, returns null.
       *  @param acct is an account number.
       *  @return the AccountData object associated with the account number.
       */
      private AccountData findAccount(int acct) throws BadAccountException{
        AccountData account = (AccountData) accounts.find(acct);
        if(account==null){
            throw new BadAccountException(acct);
        }
        return account;
      }
    }
    VirtualTeller
    package lab6;
    
    /* BadAccountException.java */
    
    /**
     *  Implements an exception that should be thrown for nonexistent accounts.
     **/
    public class BadTransactionException extends Exception {
    
      public int accountNumber;  // The invalid account number.
    
      /**
       *  Creates an exception object for nonexistent account "badAcctNumber".
       **/
      public BadTransactionException(int badAcctNumber) {
        super("Invalid input number: " + badAcctNumber);
    
        accountNumber = badAcctNumber;
      }
    }
    BadTransactionException
  • 相关阅读:
    11 改进版通过队列实现一个生产者消费者模型
    13 精进版SVIP版通过队列实现一个生产者消费者模型
    12 再次改进版通过队列实现一个生产者消费者模型
    31 进程
    join方法
    30 进程 线程
    进程传参方式和创建方式2
    设计模式 单例模式
    设计模式 抽象工厂模式
    设计模式 简单工厂模式
  • 原文地址:https://www.cnblogs.com/developerchen/p/7235857.html
Copyright © 2020-2023  润新知