我对异常处理相对较新,这是我的问题:我正在用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 :(得分: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.
}
}