【问题标题】:Producing exception error messages产生异常错误信息
【发布时间】:2016-05-03 17:07:05
【问题描述】:

在AccountApplet中我试图显示错误信息“Empty field not allowed for deposit”,一部分是通过getMessage方法完成的,另一半是不允许存款的,

但是在我的程序中,getMessage 方法产生“空字符串”,而不是“空字段”,我将如何进行更改?

getMessage 方面在 actionPerformed 方法中完成

这是 AccountApplet 类

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

帐户类

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

【问题讨论】:

    标签: java exception getmessage


    【解决方案1】:

    也许我不明白你的问题,但为什么不简单地用所需的输出设置文本呢?即,改变这个:

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

    到这里:

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

    在你的其他 catch 块中也是如此。


    您在 cmets 中问过为什么从不抛出 InsufficientFundsException,即使在抛出它的条件 if (amount &gt; balance ) 为真时也是如此。

    要学会解决这个问题,更重要的是一种伟大的调试技术,它可以帮助你学习解决未来的错误,你需要学会在脑海中遍历你的代码,看看你的脑海里有什么它正在运行。请仔细查看该撤回方法。想象它被调用的提款金额参数大于余额,会发生什么?以什么顺序?

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

    请注意,一旦抛出任何异常,该方法就会结束。那么当金额大于余额时会发生什么?什么异常只会被抛出,为什么?如果你按照我的建议去做,答案对你来说就很明显了。

    【讨论】:

    • 只是出于某种未知原因的程序要求。但是你知道为什么当输入大于余额的数字时我的资金不足没有被捕获吗?如果我颠倒 Accounts withdraw 方法中 if 语句的顺序,它会被捕获,但负数异常不会。所以问题必须在那里
    • @slow.learner:你需要学会在脑海中遍历你的代码,以便在你的脑海中看到它在运行时正在做什么。请仔细查看该撤回方法。想象它被调用的提款金额参数大于余额,会发生什么?以什么顺序?请执行此操作,您应该确切地看到为什么抛出一个异常而没有抛出另一个异常。请注意,一旦抛出异常,方法就会结束。然后,您将需要重新阅读您的要求,并根据要求找出如何正确执行此操作。
    • @slow.learner:请查看编辑以回答,如果对您有意义,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2022-07-28
    • 1970-01-01
    • 2013-03-18
    • 2014-03-15
    相关资源
    最近更新 更多