1

我的代码中有关于抛出新异常的问题。

在其中一个 JTextField 中,我输入了数字 0,但它不正确,此时单击“ENTER”按钮后,会抛出新的异常消息:

throw new Exception("Wrong number of express lanes range beginnig!! \n Please enter positive number!");

该框消息出现错误消息我只能单击“确定”。单击“确定”后,我希望程序停止,因为我想更正 JTextField 中的错误数据。我不能这样做,因为在我单击“确定”后,程序继续处理。我怎样才能停止程序并更正数据?这是我看到有问题的代码的重要部分。

    public class UILayer 
{

private JTextField text1, text2, text3, text4, text5, text6;

private void validateNumbers() throws Exception
{


    if(!text1.getText().equals("") && 
            Integer.parseInt(text1.getText()) <= 0 )
        throw new Exception("Wrong number of lanes!! \n Please enter positive number!");
    if(!text2.getText().equals("") && 
            Integer.parseInt(text2.getText()) <= 0 )
        throw new Exception("Wrong number of express lanes!! \n Please enter positive number!");

    if(!text3.getText().equals("") && 
            Integer.parseInt(text3.getText()) <= 0 )
        throw new Exception("Wrong number of express lanes range beginnig!! \n Please enter positive number!");

    if(!text4.getText().equals("") && 
            Integer.parseInt(text4.getText()) <= 0 )
        throw new Exception("Wrong number of express lanes range ending!! \n Please enter positive number!");
    if(!text5.getText().equals("") && 
            Integer.parseInt(text5.getText()) <= 0 )
        throw new Exception("Wrong number of customers!! \n Please enter positive number!");
    if(!text6.getText().equals("") && 
            Integer.parseInt(text6.getText()) <= 0 )
        throw new Exception("Wrong number of max items!! \n Please enter positive number!");

}

protected class EnterClickListener implements ActionListener
{
    private SimulationConfig info;

    EnterClickListener( )
    { 
        info = new SimulationConfig();
    }

    @Override
    public void actionPerformed( ActionEvent event ) 
    {   
        try
        {
            if(!(event.getActionCommand().equals(null )))
            {
                validateForm();
                validateNumbers();
            }   
        }
        catch(NumberFormatException e) 
        {
            JOptionPane.showMessageDialog( null, "Error.\nPlease enter number.", 
                     "Message", JOptionPane.INFORMATION_MESSAGE );
        } 
        catch (Exception e)
        {
            JOptionPane.showMessageDialog( null, "Error.\n" + e.getMessage() , 
                     "Message", JOptionPane.INFORMATION_MESSAGE );
        }
        info.setCustomerRestriction(Integer.parseInt(text5.getText()), Integer.parseInt(text6.getText()));
        info.setExpressRange(Integer.parseInt(text3.getText()), Integer.parseInt(text4.getText()));
        info.setLanesNum(Integer.parseInt(text1.getText()), Integer.parseInt(text2.getText()));
        showProgressBar();
        task = blayer.startSimulation(info);
        task.addPropertyChangeListener(new PropertyChangeListener());
        task.execute();
    }
}
4

2 回答 2

2

把你的代码

info.setCustomerRestriction(Integer.parseInt(text5.getText())....
......
task.execute();

内试,后若。像这样:

@Override
public void actionPerformed( ActionEvent event ) 
{   
    try
    {
        if(!(event.getActionCommand().equals(null )))
        {
            validateForm();
            validateNumbers();

            info.setCustomerRestriction(Integer.parseInt(text5.getText()), Integer.parseInt(text6.getText()));
    info.setExpressRange(Integer.parseInt(text3.getText()), Integer.parseInt(text4.getText()));
    info.setLanesNum(Integer.parseInt(text1.getText()), Integer.parseInt(text2.getText()));
    showProgressBar();
    task = blayer.startSimulation(info);
    task.addPropertyChangeListener(new PropertyChangeListener());
    task.execute();
        }   
    }
    catch(NumberFormatException e) 
    {
        JOptionPane.showMessageDialog( null, "Error.\nPlease enter number.", 
                 "Message", JOptionPane.INFORMATION_MESSAGE );
    } 
    catch (Exception e)
    {
        JOptionPane.showMessageDialog( null, "Error.\n" + e.getMessage() , 
                 "Message", JOptionPane.INFORMATION_MESSAGE );
    }

}
于 2013-03-15T02:20:12.243 回答
1

PC 提供的解决方案要好得多,另一种方法是编写一个用户定义的异常类,该类能够中止进一步的程序执行,因为您可以重用它,因此无需再次编写相同的代码(如果您要在多个地方或 java 类中处理相同的异常)。你需要做的是:

  1. 根据您的要求,采用扩展为 RuntimeException、Exception 或 Throwable 的公共类
  2. 采用带有 String 参数的公共构造函数
  3. 调用 super(your_String_parameter_here); 在您的构造函数内部形成(因此,如果您跳过处理此异常并直接处理超类异常,则可以将适当的消息传递到那里)
  4. 覆盖 toString() 方法为您的 Exception 类对象提供正确的字符串消息

现在,您可以在代码中的任何位置重用这个 Exception 类。

于 2013-03-15T05:59:14.327 回答