2014-04-28 125 views
0

我对异常处理相对较新,这是我的问题:我正在用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 
+0

@chiccodoro:好吧,我明白你的意思。我现在可以为我的应用程序启动异常处理。谢谢! – user3580758

回答

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. 
    } 
}