javaexceptiongetmessage

Producing exception error messages


In the AccountApplet I am trying to diplay the error message "Empty field not allowed for deposit", part of this is done by the getMessage method, the other half is not allowed for deposit,

however in my program the getMessage method produces "empty string", not "Empty field", how would i make the change?

The getMessage aspects are done in the actionPerformed method

Here is the AccountApplet Class

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
import java.text.NumberFormat;


public class AccountApplet extends JApplet implements ActionListener
{    

  //  For West
  public JLabel  ai       = new JLabel("Account ID ");
  public JTextField  aitf = new JTextField();
  public JLabel  ab       = new JLabel("Account Balance ");
  public JTextField  abtf = new JTextField();

  //  For East
  public JButton     dp   = new JButton ("Deposit");
  public JTextField  dptf = new JTextField();
  public JButton       wt = new JButton ("Withdraw");
  public JTextField  wttf = new JTextField();

  // For South
  public JLabel  status   = new JLabel("");

  Account account = new Account(1234,1000);  // ******** here *******  

  public void init()
  {
    this.setSize(400, 90);

    //----------------------
    //  Set up the Structure
    //----------------------

    Container      c = getContentPane();
    JPanel         b = new JPanel(new BorderLayout());
    JPanel      west = new JPanel(new GridLayout(2,2));
    JPanel      east = new JPanel(new BorderLayout());
    JPanel depo_with = new JPanel(new GridLayout(2,2));

    // Add BorderLayout to the container
    c.add(b);

    // Add everything to West
    b.add(west, BorderLayout.WEST);
    west.setBorder(new TitledBorder("Display Account Information"));
    west.add(ai);
    west.add(aitf);
    aitf.setEditable(false);
    west.add(ab);
    west.add(abtf);
    abtf.setEditable(false);

    // Add everything to EAST
    b.add(east, BorderLayout.EAST); 
    east.setBorder(new TitledBorder("Deposit or Withdrawl Funds"));    
    east.add(depo_with, BorderLayout.EAST);    
    depo_with.add(dptf);
    depo_with.add(dp);
    depo_with.add(wttf);
    depo_with.add(wt);   
    dp.addActionListener(this);
    wt.addActionListener(this);

    // Add everything to SOUTH
    b.add(status, BorderLayout.SOUTH);



    refreshFields();

  }  // End intit

//-------------------------------------------------------------------------------------------------------------------------------------------------------
  public void actionPerformed(ActionEvent e)
  {


    if (e.getSource() == dp)  //  Executes if deposit was clicked
    {
      try 
      {  
        getAmount(dptf);
        account.deposit(Double.parseDouble(dptf.getText()));
        account.setBalance(account.balance); 
        status.setText("Deposit processed");

        refreshFields();
      } 


      catch (NegativeAmountException nae) 
      {  
        status.setText(nae.getMessage() + " not allowed for deposit");
      }
      catch (EmptyFieldException efe) 
      {  
        status.setText(efe.getMessage() + " not allowed for deposit");
      }
      catch (Exception ex) 
      { 
        status.setText(ex.getMessage() + " not allowed for deposit");
      } 
    }   

    if (e.getSource() == wt)  //  Executes if withdraw was clicked
    {
      try 
      {  
        getAmount(wttf);
        account.withdraw(Double.parseDouble(wttf.getText()));
        account.setBalance(account.balance); 
        status.setText("Withdraw processed");

        refreshFields();
      } 

      catch (InsufficientFundsException ife)
      {
        status.setText(ife.getMessage() + " Insufficient funds");
      }
      catch (NegativeAmountException nae) 
      {  
        status.setText(nae.getMessage() + " not allowed for withdraw");
      }
      catch (EmptyFieldException efe) 
      {  
        status.setText(efe.getMessage() + " not allowed for withdraw");
      }
      catch (Exception ex) 
      { 
        status.setText(ex.getMessage() + " not allowed for withdraw");
      }    


    }    


  } // end ActionPerformed


  public void refreshFields()
  {
    NumberFormat fmt = NumberFormat.getCurrencyInstance();
    aitf.setText("" + account.getId() );
    abtf.setText("" + fmt.format(account.getBalance()));

    // diplays accound id and balance in left text fields
    //should be called when the applet is first displayed and after each valid transaction
  }

 public double getAmount(JTextField tf) throws EmptyFieldException,
                                               NumberFormatException,
                                               NegativeAmountException
 {
   double depo;

   try 
   {
     depo = Double.parseDouble(dptf.getText());  // read in one textfield and convert to a number
   } 
     catch (NumberFormatException nfe)  // catch NumberFormatException
   {
     throw nfe;  // catch throws NumberFormatException
   }



    return depo;
  }  //  End    



} // End Class

The account class

import java.awt.*;
import java.awt.event.*;



public class Account
{
  int id         = 1234;
  double balance = 1000.00;

  Account (int id, double balance) 
  {
    this.id = id;
    this.balance = balance;
  }    

  public int getId()
  {

    return id; 
  }

  public double getBalance()
  {
    return balance;   
  }

  public void setBalance(double balance) throws NegativeAmountException
  {
    if ( balance < 0)
      throw new NegativeAmountException();
    this.balance = balance;
  }

  public void deposit(double amount) throws NegativeAmountException
  {
    if (amount < 0)
    throw new NegativeAmountException();
    balance += amount;
  }

  public void withdraw(double amount) throws NegativeAmountException,
                                             InsufficientFundsException
  {

    if (amount > balance )
    {
      throw new NegativeAmountException();
    }

    if (amount > balance )
    {
      throw new InsufficientFundsException();
    }

    balance -= amount;


  }




}

EmptyFieldException

public class EmptyFieldException extends Exception

{
  EmptyFieldException() 
  {
    super();
  }

}

InsufficientFundsException

public class InsufficientFundsException extends Exception
{
  InsufficientFundsException()
  {
    super();
  }
}

NegativeAmountException

public class NegativeAmountException extends Exception
{
  NegativeAmountException()
  {
    super();
  }
}

Solution

  • Maybe I don't understand your question, but why not simply set the text with the desired output? i.e., change this:

    catch (EmptyFieldException efe) 
    {  
        status.setText(efe.getMessage() + " not allowed for deposit");
    }
    

    to this:

    catch (EmptyFieldException efe) 
    {  
        status.setText("An empty field is not allowed for deposit");
    }
    

    and similarly in your other catch blocks.


    You've asked in comments why the InsufficientFundsException is never thrown, even when the condition that throws it, if (amount > balance ) is true.

    To learn to solve this, and more important a great debugging technique that will help you learn to solve future bugs, you need to learn to walk through your code mentally to see in your mind's eye what it's doing as it runs. Please look closely at that withdraw method. Picture it being called with a withdraw amount parameter greater than the balance, what happens? In what order?

    public void withdraw(double amount) throws NegativeAmountException,
                                               InsufficientFundsException {
        if (amount > balance ) {
            throw new NegativeAmountException();
        }
        if (amount > balance ) {
            throw new InsufficientFundsException();
        }
        balance -= amount;
    }
    

    Note that once any exception is thrown, the method ends. So what happens when amount is greater than balance? What exception only gets thrown and why? If you do as I suggest, the answer will become obvious to you.