解决java或jsp中的For input string的错误

问题

我们在做接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代码,或者其他语言的代码时,但凡用到了封装类的转型,我们要考虑到被转型的数据,是否包含类似于空格的字符串。

因为空格我们不容易发现,因而,从这一点说明了,我们为什么使用框架?因为,他们把很多东西,都封装好了,也做了数据的安全措施。


版权声明:本文为lvoelife原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。