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();
}
}
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.