问题
我们在做接jsp开发时,不论是在jsp页面,还是在controller中,都会遇到这样的错误,For input String错误。
为什么会出现这样的错误呢?
当时,我在init中从数据库读取数据来初始化页面,把数据放在a标签中,如代码:
<div id="sign_tab">
<ul>
<c:forEach items="${foreEndTabs }" var="tab">
<li>
<a href="fore_jsp/tab_info.jsp?tid= ${tab.tid }" class="sign_a" >${tab.tname}</a>
</li>
</c:forEach>
</ul>
</div>
当我在执行时,就会报如下的错误:
org.apache.jasper.JasperException: java.lang.NumberFormatException: ***For input string: " 5"***
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:541)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:435)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
我需要在tab_info.jsp来获取a标签的整数参数,因而,我需要用如下代码去将其转换成整数:
List<Book> books=FEBookService.getBooksByTabId(
Integer.parseInt((String)request.getParameter("tid")));
但是,Integer.parseInt()没有办法将其转换,这是为什么吗?这其实是java报出的错误。
java为什么会报出这个错误?我在这边举个例子:
public class Test {
public static void main(String[] args) {
String s = " 5";
System.out.println(Integer.parseInt(s));
}
}
如下是它的输出结果:
你会发现,和jsp中的代码报出的错误一样,其实,Integer.parseInt()是无法解析非纯数字的字符串,看其源码就知道了:
在源码中,定位出字符串s =" 5 "
的首字母是空格,不是+(正号),也不是 -(负号),因而,报出错误。
当然,如果 s= "1234s"
,Integer.parseInt(s)也会报出错误,因为它只识别纯数字的字符串。
既然知道了原理,就可以如下的解决方案。
解决方案
方案一
经过查看它的源代码,我们发现它识别的是整数的字符串,而我们在tid= ${tab.tid }" 这里有个空格,因而,我们获取到的是“ 5”,前面含有两个空格,所以,它本身不是数字,因而,无法将其解析出来,因而,就会报出异常。我们知道了这个原理,那么就容易求解了。
我们只需要去掉空格,就会得到我们想要的“5”,这是我的运行成功后的结果:
方案二
引入commons-lang3包:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
调用NumberUtils.isDigits(String str)
方法,若返回true表示是纯数字的字符串,否则不是纯数字的字符串。
方案三
引入hutool-all包:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.4</version>
</dependency>
调用NumberUtil.isNumber(String str)
方法,若返回true表示是纯数字的字符串,否则不是纯数字的字符串。
备注
所以,以后我们在编写java代码,或者其他语言的代码时,但凡用到了封装类的转型,我们要考虑到被转型的数据,是否包含类似于空格的字符串。
因为空格我们不容易发现,因而,从这一点说明了,我们为什么使用框架?因为,他们把很多东西,都封装好了,也做了数据的安全措施。