Servlet报500内部错误:JSP传值引发NumberFormatException求助
猜数字游戏500内部服务器错误排查与解决
错误原因分析
报错信息java.lang.NumberFormatException: For input string: " 1"明确指向:字符串转整数时,输入的字符串包含前置空格,Integer.parseInt()无法解析带空格的字符串,触发异常导致500错误。
问题定位
查看JSP代码中的隐藏域定义:
<input type="hidden" name="minimum" value=" <%= minimum.getValue() %>" /> <input type="hidden" name="maximum" value=" <%= maximum.getValue() %>" /> <input type="hidden" name="guessNum" value=" <%= guessNum.getValue() %>" /> <input type="hidden" name="guesses" value=" <%= guesses.getValue() %>" />
可以看到value属性中,<%= %>表达式前多了一个空格,导致传递给Servlet的参数值是带前置空格的字符串(比如" 1"),而非纯数字字符串。
解决方案
1. 修正JSP隐藏域的空格问题
将JSP中所有隐藏域的value属性里的前置空格删除,修改后代码如下:
<input type="hidden" name="minimum" value="<%= minimum.getValue() %>" /> <input type="hidden" name="maximum" value="<%= maximum.getValue() %>" /> <input type="hidden" name="guessNum" value="<%= guessNum.getValue() %>" /> <input type="hidden" name="guesses" value="<%= guesses.getValue() %>" />
2. 增强Servlet的参数处理健壮性(可选但推荐)
为了避免用户输入空格、空值等情况再次触发异常,在Servlet解析参数前做以下处理:
- 对参数进行去空格操作
- 增加非空校验
修改后的Servlet参数解析代码示例:
// 处理用户输入的guess参数 String guessStr = request.getParameter("guess"); if (guessStr == null || guessStr.trim().isEmpty()) { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<p>请输入有效的数字!</p>"); out.println("<a href='index.jsp'>返回重新输入</a>"); return; } int guessInt = Integer.parseInt(guessStr.trim()); GuessNumber guess = new GuessNumber(guessInt); // 处理其他隐藏域参数 int minInt = Integer.parseInt(request.getParameter("minimum").trim()); GuessNumber minimum = new GuessNumber(minInt); int maxInt = Integer.parseInt(request.getParameter("maximum").trim()); GuessNumber maximum = new GuessNumber(maxInt); int guessNumInt = Integer.parseInt(request.getParameter("guessNum").trim()); GuessNumber guessNum = new GuessNumber(guessNumInt); int guessesInt = Integer.parseInt(request.getParameter("guesses").trim()); GuessNumber guesses = new GuessNumber(guessesInt);
3. 修正Servlet路径大小写问题
Servlet中生成的form的action为/GuessGame,但Servlet的@WebServlet注解中urlPattern是/guessGame,大小写不一致可能导致后续请求404,建议修改为一致的路径:
out.println("<form name='GuessNumForm' action='guessGame' method='post'>");
内容的提问来源于stack exchange,提问作者Wonjun Jo
相关产品推荐
相关产品推荐

