1

我有文本字段数组,它必须只接受数值,即 1-5。

<s:textfield name="marks[0]" maxlength="1" /> 
<s:textfield name="marks[1]" maxlength="1" /> 
<s:textfield name="marks[2]" maxlength="1" />  and so on upto 9 textfields.

我有如下的getter/setter方法

public List<Integer> getMarks(){
     return marks;
}
public void setMarks(List<Integer> marks){
     this.marks = marks;
}

如何确保用户不会输入字母等非数字值?如果我输入字符,它会引发运行时异常“java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer”,指向 Next JSp 页面中的 validate 方法。

public void validate(){
  for(i=0;i<9;i++){
     if (marks.get(i)>5)     //this line throws above ClassCastException
    addFieldError("...");
  }
}

如何解决此异常以及验证以继续?在存在单个文本字段的其他页面中,显示 invalid.fieldvalue.error 但对于列表,我遇到了异常

4

2 回答 2

1

只需将您的验证逻辑放在try catch块内

public void validate(){
  try{
    for(i=0;i<9;i++){
      if (marks.get(i)>5)     //this line throws above ClassCastException
        addFieldError("...");
    }
  }catch(Exception e){
  }
}
于 2012-12-18T21:07:31.397 回答
0

我通常这样做(可能有更好的解决方案)

public void setMarks(List<String> marksStr){
  List<Integer> marks = new ArrayList();

  for(String markStr : marksStr) {
    try {
      Integer mark = Integer.parseInt(markStr);
      marks.add(mark);
    } catch (NumberFormatException e) {
      addFieldError("", "Wrong mark value: " + markStr);
    }
  }
  this.marks = marks;
}
于 2012-12-18T14:24:43.337 回答