केवल एक मामले में अपवाद फेंको

मेरे कंप्यूटर विज्ञान वर्ग के लिए अपवाद फेंकने के साथ काम करने के लिए मेरे पास असाइनमेंट है। असाइनमेंट किसी उपयोगकर्ता के बैंक खाते को प्रबंधित करने के लिए एक एप्लेट बनाता है।

मेरी समस्या निम्नानुसार है: मुझे केवल एक अपवाद (अपर्याप्तफंड्स अपवाद) फेंकने की आवश्यकता होती है जब कोई उपयोगकर्ता शेष राशि से अधिक धन वापस लेने का प्रयास करता है। हालांकि, मैं केवल वापसी के मामले में अपर्याप्तफंड्स अपवाद को फेंकना चाहता हूं, जमा नहीं।

यहां उन विधियों के लिए कोड दिया गया है जिन पर समस्या MINUS पर उन हिस्सों पर केंद्रित है जिनके साथ मुझे समस्याएं आ रही हैं:

क्रियाप्रचारित विधि (मैं एक्शनलिस्टर इंटरफ़ेस को कार्यान्वित कर रहा हूं)

बटन को क्लिक किए गए बटन के आधार पर इस विधि की आवश्यकता है - जमा या निकासी बटन - प्रक्रिया लेनदेन विधि। लेनदेन विधियां खाता ऑब्जेक्ट की शेष राशि को विधि में पास की गई राशि को केवल जोड़ या घटाना। फिर यदि कोई अपवाद है, तो यह अपवाद को पकड़ लेगा और त्रुटि प्रिंट करेगा। वर्तमान में पकड़े गए अपवादों को वर्तमान में निकासी और जमा लेनदेन दोनों पर लागू होता है, जबकि एक को अभी भी फेंकने की आवश्यकता होती है - अपर्याप्तफंड्स अपवाद - केवल लागू होता है लेनदेन वापस लेना इसके अलावा, मैं अपवाद फेंकने के लिए खाता ऑब्जेक्ट में निकासी विधि को संशोधित नहीं कर सकता।

GetAmount विधि:

मेरे पास इस विधि में अपर्याप्तफंड्स अपवाद को फेंकने का विकल्प नहीं है

मैंने इसे जोड़ने की कोशिश की:

if(getAmount(tf4) > acc1.getBalance())
{
  throw InsufficientFundsException("Insufficient Funds");
}

यहां वापस लेने के ठीक पहले:

 if (e.getSource() == withdraw)
 {
   try
   {
     acc1.withdraw(getAmount(tf4));
     refreshFields();
     status.setText("Withdrawal Processed");
   }
   catch(EmptyFieldException ex)
   {
     status.setText(ex.getMessage() + "withdraw");
   }
   catch(NumberFormatException ex)
   {
     status.setText(ex.getMessage() + "withdraw");
   }
   catch(NegativeAmountException ex)
   {
     status.setText(ex.getMessage() + "withdraw");
   }
 }

लेकिन मुझे एक त्रुटि मिलती है क्योंकि actionPerformed विधि फेंकता अपर्याप्त FundsException नहीं कर सकता है।

अगर मैं एक कोशिश/पकड़ ब्लॉक में एक अपर्याप्तफंड्स अपवाद की पकड़ करने का प्रयास करता हूं, तो मुझे अन्य प्रयास/पकड़ ब्लॉक के लिए एक त्रुटि मिलती है क्योंकि मैंने अपवाद नहीं पकड़ा है ... क्योंकि मैं नहीं चाहता उस अपवाद को पकड़ने के लिए।

अनुरोध के अनुसार, पूरा कोड यहां दिया गया है:

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

public class AccountApplet extends JApplet implements ActionListener
{  
  Container c = getContentPane();
  JPanel p1 = new JPanel(),
         p2 = new JPanel(),
         p3 = new JPanel(),
         p4 = new JPanel();
  JLabel lab1 = new JLabel("Account ID");
  JLabel lab2 = new JLabel("Account Balance");
  JLabel lab3 = new JLabel("Deposit");
  JLabel lab4 = new JLabel("Withdraw");
  JLabel status = new JLabel("Status Bar");
  JTextField tf1 = new JTextField(),
             tf2 = new JTextField(),
             tf3 = new JTextField(),
             tf4 = new JTextField();
  JButton deposit = new JButton("Deposit"),
          withdraw = new JButton("Withdraw");
  Account acc1 = new Account(1234, 1000.00);
  double amount;

  public void init()
  {           
    tf1.setEditable(false);
    tf2.setEditable(false);       
    c.setLayout(new BorderLayout());
    c.add(p1, BorderLayout.WEST);
    p1.setBorder(new TitledBorder("Display Account Information"));
    p1.setLayout(new GridLayout(2,2));
    p1.add(lab1);
    p1.add(tf1);
    p1.add(lab2);
    p1.add(tf2);
    c.add(p2, BorderLayout.EAST);
    p2.setBorder(new TitledBorder("Deposit or Withdraw Funds"));
    p2.setLayout(new BorderLayout());
    p2.add(p3, BorderLayout.WEST);
    p2.add(p4, BorderLayout.EAST);
    p3.setLayout(new GridLayout(2,1));
    p3.add(lab3);
    p3.add(lab4);
    p4.setLayout(new GridLayout(2,2));
    p4.add(tf3);
    p4.add(deposit);
    p4.add(tf4);
    p4.add(withdraw);
    c.add(status, BorderLayout.SOUTH);
    deposit.addActionListener(this);
    withdraw.addActionListener(this);
    refreshFields();     
  }

  public void actionPerformed(ActionEvent e)
  {
    status.setText("");
    if (e.getSource() == deposit)
    {
      try
      {
        acc1.deposit(getAmount(tf3));
        refreshFields();
        status.setText("Withdrawal Processed");
      }
      catch(EmptyFieldException ex)
      {
        status.setText(ex.getMessage() + "deposit");
      }
      catch(NumberFormatException ex)
      {
        status.setText(ex.getMessage() + "deposit");
      }
      catch(NegativeAmountException ex)
      {
        status.setText(ex.getMessage() + "deposit");
      } 
    }
    if (e.getSource() == withdraw)
    {
      try
      {
        acc1.withdraw(getAmount(tf4));
        refreshFields();
        status.setText("Withdrawal Processed");
      }
      catch(EmptyFieldException ex)
      {
        status.setText(ex.getMessage() + "withdraw");
      }
      catch(NumberFormatException ex)
      {
        status.setText(ex.getMessage() + "withdraw");
      }
      catch(NegativeAmountException ex)
      {
        status.setText(ex.getMessage() + "withdraw");
      }
    }
  }

  public void refreshFields()
  {
    tf1.setText(String.valueOf(acc1.getId()));
    tf2.setText("$" + String.valueOf(acc1.getBalance()));
    tf3.setText("");
    tf4.setText("");
    status.setText("");
  }

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

    if(tf.getText().equals(""))
    {
      throw new EmptyFieldException("Empty field not allowed for ");
    }
    try
    {
      amount = Double.parseDouble(tf.getText());
    }
    catch(Throwable ex)
    {
      throw new NumberFormatException("Insufficient funds", ex);
    }
    if(amount < 0)
    {
      throw new NegativeAmountException("Negative amount not allowed for ");
    }

    else
    { 
      return Double.parseDouble(tf.getText());
    }
  }

}

खाता वर्ग कोड:

public class Account
{
  private int id;
  private double balance;

  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)
  {
    this.balance = balance;
  }

  public void deposit(double amount)
  {
    balance += amount;
  }

  public void withdraw(double amount)
  { 
    balance -= amount;
  }
}

अपवाद कोड:

public class EmptyFieldException extends Exception
{
  EmptyFieldException(String message)
  {
    super(message);
  }
}

,

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

,

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

क्या कोई मेरी मदद कर सकता है? मुझे इस अपवाद को कहां फेंकना चाहिए?

0
भागों में बजाए प्रवाह में पूरा कोड पोस्ट करें
जोड़ा लेखक Gagan93, स्रोत

1 उत्तर

अपवाद श्रृंखला तंत्र का उपयोग करें। उदाहरण के लिए इस तरह कुछ कोशिश करें।

if (e.getSource() == withdraw) {
   try
   {
     if(getAmount(tf4) > acc1.getBalance())
     {
         throw InsufficientFundsException("Insufficient Funds");
     }
     acc1.withdraw(getAmount(tf4));
     refreshFields();
     status.setText("Withdrawal Processed");
   }
   catch(InsufficientFundsException ex)
   {
      //rethrow some unchecked exception like IllegalArgumentException
      //or your own checked exception like EmptyFieldException 
      throw new EmptyFieldException("some message", ex);

      //or add the exception message and trace to status.
      status.setText(ex.getMessage() + "withdraw");
   }
   catch(EmptyFieldException ex)
   {
      status.setText(ex.getMessage() + "withdraw");
   }
   catch(NumberFormatException ex)
   {
      status.setText(ex.getMessage() + "withdraw");
   }
   catch(NegativeAmountException ex)
   {
     status.setText(ex.getMessage() + "withdraw");
   }
}

ठीक है आपके कोड में अपर्याप्तफंड्स एक्सेप्शन को अर्थपूर्ण रूप से फेंकने का कोई तरीका नहीं है। इसका सबसे अच्छा तरीका यह है कि इसे टालना है और इस तरह की जांच में सीधे संदेश मुद्रित करने के लिए status.setText() का उपयोग करें।

     if(getAmount(tf4) > acc1.getBalance())
     {
         status.setText("Insufficient Funds - Withdraw cancelled");
     }
0
जोड़ा
चूंकि कोशिश/पकड़ कथन कार्रवाई में है विधिबद्ध विधि, मैं अपर्याप्त FundsException फेंकता नहीं कर सकता, है ना?
जोड़ा लेखक Colin Burr, स्रोत
क्या आप इसे प्रतिबिंबित करने के लिए अपना कोड संपादित कर सकते हैं? मुझे इस बारे में सोचने में मुश्किल हो रही है। जैसा कि पोस्ट किया गया है, संकलित करने पर, मुझे त्रुटि नहीं मिल सकती है: InsufficientFundsException ("अपर्याप्त निधि") फेंक दें;
जोड़ा लेखक Colin Burr, स्रोत
जोड़ा, अपवाद कोड भी जोड़ा।
जोड़ा लेखक Colin Burr, स्रोत
हाँ। यह मेरा एक चेक अपवाद है जिसे मैं मानता हूं, इसलिए आप फेंकने वाले खंड में इसे जोड़ने के बिना इसे फेंक नहीं सकते। लेकिन आप एक अनचेक अपवाद फेंक सकते हैं या अपर्याप्तफंड्स एक्सेप्शन को एक चेक अपवाद में लपेट सकते हैं जिसे आप फेंक सकते हैं।
जोड़ा लेखक Nazgul, स्रोत
क्या आप खाता वर्ग के लिए कोड भी जोड़ सकते हैं।
जोड़ा लेखक Nazgul, स्रोत