Java 抛出自己的异常

Java 抛出自己的异常,java,Java,我是Java新手,一直在研究一种转换器,它将接受dec数字并将其转换为二进制,反之亦然。我想实现异常处理,但很难完全理解这个概念。我希望程序捕获一个NumberFormatException并抛出一个我在单独的类中创建的NotInBinaryException。我能够抛出新的异常,但不确定如何成功捕获异常以显示JOptionPane,该异常将显示在程序上,提示用户以二进制格式输入数字,同时清除错误并将焦点设置在存在错误的文本字段上。到目前为止,这是我创建的代码。如果能帮我回到正轨,我将不胜感激

我是Java新手,一直在研究一种转换器,它将接受dec数字并将其转换为二进制,反之亦然。我想实现异常处理,但很难完全理解这个概念。我希望程序捕获一个
NumberFormatException
并抛出一个我在单独的类中创建的
NotInBinaryException
。我能够抛出新的异常,但不确定如何成功捕获异常以显示
JOptionPane
,该异常将显示在程序上,提示用户以二进制格式输入数字,同时清除错误并将焦点设置在存在错误的文本字段上。到目前为止,这是我创建的代码。如果能帮我回到正轨,我将不胜感激

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class ImprovedBaseGui extends JFrame implements ActionListener
{
 private JTextField txtBaseTen;
 private JTextField txtBaseTwo;
 private JButton btnBaseTen;
 private JButton btnBaseTwo;
 private JButton btnClear;
 public ImprovedBaseGui()
{
    this.setTitle("Base 10/2 Converter");    
    Container canvas = this.getContentPane();

    canvas.add(createCenterPanel(), BorderLayout.CENTER);
    canvas.add(createSouthPanel(), BorderLayout.SOUTH);


    this.setResizable(false);
    this.setSize(475, 150);
    this.setLocation(800, 500);
    this.setVisible(true);
    this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
}

private JPanel createSouthPanel()
    {
        JPanel pnlSouth = new JPanel();

        btnBaseTen = new JButton("Base 10");
        btnBaseTen.addActionListener(this);
        btnBaseTen.setToolTipText( "Use to convert Base 2 to Base 10" );
        btnBaseTen.setBackground(Color.CYAN);
        pnlSouth.add(btnBaseTen);

        btnBaseTwo = new JButton("Base 2");
        btnBaseTwo.addActionListener(this);
        btnBaseTwo.setToolTipText( "Use to convert Base 10 to Base 2" );
        btnBaseTwo.setBackground(Color.YELLOW);
        pnlSouth.add(btnBaseTwo);

        btnClear = new JButton("Clear");
        btnClear.addActionListener(this);
        btnClear.setBackground(Color.RED);
        pnlSouth.add(btnClear);

        return pnlSouth;
    }

private JPanel createCenterPanel()
    {
        JPanel pnlCenter = new JPanel();
        pnlCenter.setLayout(new GridLayout(2,2));

        pnlCenter.add(wrapMeInAPanel(new JLabel ("Base 10")));
        txtBaseTen = new JTextField(16);
        txtBaseTen.setBackground(Color.YELLOW);
        pnlCenter.add(wrapMeInAPanel(txtBaseTen));

        pnlCenter.add(wrapMeInAPanel(new JLabel("Base 2")));
        txtBaseTwo = new JTextField(16);
        txtBaseTwo.setBackground(Color.CYAN);
        pnlCenter.add(wrapMeInAPanel(txtBaseTwo));

        return pnlCenter;
    }

    public static void main(String[] args)
    {
      new ImprovedBaseGui();
    }

    @Override
    public void actionPerformed(ActionEvent e)
        {

            if(e.getSource() == btnClear)
            {
                txtBaseTen.setText("");
                txtBaseTwo.setText("");
            }
            if(e.getSource() == btnBaseTwo)
            {
                try
                    {
txtBaseTwo.setText(Integer.toBinaryString(Integer.parseInt(txtBaseTen.getText())));
                    }
                catch(NumberFormatException err)
                    {
JOptionPane.showMessageDialog(this, txtBaseTen.getText()+"");
                    txtBaseTen.setText("");
                    txtBaseTen.grabFocus();
                    }

            }
            if(e.getSource() == btnBaseTen)
            {
                try
                    {
txtBaseTen.setText(Integer.toString(Integer.parseInt(txtBaseTwo.getText(), 2)));
            }
            catch(NumberFormatException err)
            {
            throw new NotInBinaryException();
                }

            }

        }

     private JPanel wrapMeInAPanel(Component c)
            {
                JPanel panel = new JPanel();
                panel.add(c);
                return panel;
            }
}

如果您的方法无法处理二进制解析中的
NumberFormatException
,则只应抛出
NotInBinaryException
。但它可以处理它,你应该处理它。这里不需要您的
notInBinareyException

只需处理
NumberFormatException
,就像在
txtBaseTen
案例中处理它一样,尽管您可能希望为这两种情况选择一条更用户友好的错误消息

try
{
    txtBaseTen.setText(Integer.toString(Integer.parseInt(txtBaseTwo.getText(), 2)));
}
catch(NumberFormatException err)
{
    JOptionPane.showMessageDialog(this, txtBaseTwo.getText()+"");
    txtBaseTwo.setText("");
    txtBaseTwo.grabFocus();
}

如果您坚持使用
NotInBinaryException
,那么让另一个方法为您执行转换,并让它抛出
NotInBinaryException
。如果
NotInBinaryException
RuntimeException
,则不需要使用
throws
子句

private String getDecimalText(String binaryText) throws NotInBinaryException
{
    try
    {
        return Integer.toString(Integer.parseInt(decimalText, 2));
    }
    catch (NumberFormatException err)
    {
        throw new NotInBinaryException();
    }
}
然后在
actionPerformed
方法中捕捉它

try
{
    txtBaseTen.setText(getDecimalText(txtBaseTwo.getText()));
}
catch(NotInBinaryException err)
{
    JOptionPane.showMessageDialog(this, "Number entered was not in binary: " + txtBaseTwo.getText());
    txtBaseTwo.setText("");
    txtBaseTwo.grabFocus();
}

谢谢你的意见。您给出的解决方案是我最初是如何编写代码的。但是为了学习抛出我自己的异常,我想知道如何创建我自己的异常并让NumberFormatException抛出它。谢谢你的帮助。你的建议很有道理。我试图在不使用方法处理转换的情况下实现这一点,但它根本不起作用。我想我只是想得太多了,因为现在看它似乎太简单了。