异常处理(或记录)

时间:2014-04-28 10:10:16

标签: java exception-handling

我对异常处理相对较新,这是我的问题:我正在用Java编写一个应用程序,用户必须在各个面板上的各个字段中输入数据,所有这些都在同一帧上。每个面板都有一个保存按钮。按“保存”后,将使用数据作为属性创建对象。每个setter方法检查数据(字符串必须小于一定长度,整数必须以某些间隔落入等),如果不正常,则抛出异常(我创建了自己的BadDataException类型)。这些异常会一直抛回到框架,框架应该处理(显示)它们。

所以这就是问题:如果用户在多个字段中输入错误数据,我怎样才能向他显示他犯错的所有字段?现在我得到的是第一个抛出异常的消息(我知道它应该像那样)。我是否必须在面板中添加一些检查(我不认为这样做是对的)或者是否有任何方法可以在他按“保存”后“记录”所有例外情况?如果我可以这样做,那么我将能够在主框架的标签上显示它们。

我想这个问题已经足够清楚,但我已经写了一些简单的代码来说明。

public class MyFrame extends JFrame {

private JTextField stringFieldOne;
private JTextField stringFieldTwo;

public MyFrame() {

    stringFieldOne = new JTextField();
    this.add(stringFieldOne);

    stringFieldTwo = new JTextField();
    this.add(stringFieldTwo);

    JButton saveButton = new JButton();
    saveButton.addActionListener(new SaveButtonListener());
    this.add(saveButton);

}//constructor

private void save() {

    SaveObject obj = new SaveObject();

    try {
        obj.setStringOne(stringFieldOne.getText());
        obj.setStringTwo(stringFieldTwo.getText());
    }
    catch (BadDataException bde) {
        //what goes here???
    }

}//method

class SaveButtonListener implements ActionListener {

    public void actionPerformed(ActionEvent evt) {

        save();

    }//method

}//class

}//class


public class SaveObject {

private String theStringOne;
private String theStringTwo;

public void setStringOne(String someString) throws BadDataException {

    if (someString.length() <= 20) {
        theStringOne = someString;
    }
    else {
        throw new BadDataException("The string you introduced has more than 20 characters");
    }

}//method

public void setStringTwo(String someString) throws BadDataException {

    if (someString.length() <= 5) {
        theStringTwo = someString;
    }
    else {
        throw new BadDataException("The string you introduced has more than 5 characters");
    }

}//method

}//class

1 个答案:

答案 0 :(得分:2)

在set方法中抛出异常可能不适合您的要求。异常会中断正常控制流并进入异常处理控制流。也就是说,所有其他数据检查都不会被执行。

通常情况下,您会验证所有数据并在列表中收集验证结果。只有在完成所有验证后,才会在列表不为空的情况下抛出异常。

示例:

private void save() {
    SaveObject obj = new SaveObject();

    obj.setStringOne(stringFieldOne.getText());
    obj.setStringTwo(stringFieldTwo.getText());

    List<string> validationErrors = obj.validate();

    if (validationErrors.length > 0) {
        // do whatever you need to do, e.g. throw an exception, or render the
        // messages.
    }
}