我有一个调用Java servlet的HTML表单,表单包含20个复选框(例如名称为c1
,c2
,c3
... c20
) 。
我试图在java布尔数组cbox
中捕获这些复选框的值。
以下代码......
int ii=0;
boolean cbox[] = new boolean[20];
for (ii=0; ii<20; ii++)
cbox[ii] = (req.getParameter("c"+String.valueOf((int)(ii+1))).equals("on"))?true:false;
给出java.lang.NullPointerException
。
但是,如果我要将其更改为(例如,移除ii
中的valueOf
),我就不会收到运行时错误:
cbox[ii] = (req.getParameter("c"+String.valueOf((int)(1))).equals("on"))?true:false;
当然,这并不能让我到达我想要的地方。我必须在某个地方犯一个愚蠢的错误,但我无法发现它。有人看到了吗?
答案 0 :(得分:2)
当您尝试引用未初始化的Object(null)时,会出现NullPointerException。
查看您的代码,有两种可能性:
req.getParameter
。req.getParameter("c"+String.valueOf((int)(ii+1)))
。顺便说一下,如果返回的参数已经是布尔值,则无需检查它的值并返回true或false,因为它的值已经为true或false。您可以将其简化为:
cbox[ii] = (req.getParameter("c"+String.valueOf((int)(ii+1))).equals("on"));
修改:要回答您的评论,您可以验证参数是否容易存在:
String param = req.getParameter("c" + String.valueOf(ii + 1));
cbox[ii] = "on".equals(param);
为了更安全,我还会检查req
以确保它不为空。
if(req != null)
{
String param = req.getParameter("c" + String.valueOf((ii + 1));
cbox[ii] = "on".equals(param);
}
请注意,我删除了强制转换(int)ii + 1
,因为表达式已经是整数类型。
此外,如果ii
仅用作迭代器ID,则可以直接在循环中声明它,所以不要这样做:
int ii = 0;
for(ii = 0; ii < 20; ii++)
您可以直接撰写for(int ii = 0; ii < 20; ii++)
答案 1 :(得分:1)
这里的问题是在servlet中,您将收到on
作为html选中复选框的默认值,否则为null。由于未选中所有复选框,因此您将获得NPE。试试这段代码:
boolean[] cbox = new boolean[20];
for(int i = 0; cbox.length > i; i++) {
cbox[i] = null != req.getParameter("c" + (1 + i));//if not null then true else false
}
您还可以使用其他选项:
在 html / jsp 中创建具有相同名称但值不同的复选框:
<input type="checkbox" name="cbox" value="1"/>
<input type="checkbox" name="cbox" value="2"/>
...
<input type="checkbox" name="cbox" value="20"/>
在 servlet 中,您可以使用单行获取所有选中的复选框:
String[] cbox = req.getParameterValues("cbox");
此处,您不会将on
视为值,{g}为1
,2
等等。只有复选框才能到达。