查询项目编号时关于处理NumberFormatException异常的问题

1.首先,NumberFormatException异常出现的原因是:
由于查询项目编号时,只能接收数字类型,然后进行查询输出结果。
当用户输入非数字类型的数据,是查询不到数据的,
并在项目后台Controller中,会报出NumberFormatException异常,
此异常是一个运行时异常,异常的意思是:String类型强制转换为Int类型失败异常,
因为String变量的值包含中英文字符,所以需要手动去处理。
通常处理的话就是使用try-catch()代码快,try体里面放入的是可能会出现异常的语句代码。
catch(),catch()方法的参数需要对异常进行捕获、cat()体里放入的是对这个异常的处理操作,
也就是如何具体解决这个异常。
在这里插入图片描述
2.前台到后台的传值:
用户选择"项目编号"去输入进行查询的这个值是从前台传来的,
在与jsp前台页面相对应的controller控制器的方法中,
通过@RequestParam()注解来进行接收这个参数。
得到这个参数后,对它进行强制的从String–>Int类型的转换:Integer.parseInt(“参数”.toString()) 显然是行不通的,
因为String字符串含有中英文字符,不是非数字的,所以不能直接转换成Int类型。

3.所以,就需要考虑到,使用一个方法来解决问题:
这个方法在StringUtils类中,StringUtils是String字符串类的一个工具类,
此类中有一个isNumeric(String str)方法,该方法是一个静态方法。
在这里插入图片描述
此方法的作用就是判断一个String参数是否为数字,也就是不包含中英文字符。
如果不包含中英文字符,为数字,即返回true,不然的话返回false。
通过查看此方法的源码,能够看到具体的一个实现过程:

在这里插入图片描述
以上这个图片就是StringUtils.isNumeric(String str)方法的源码。
方法返回的类型为boolean,
对这个String参数str进行判断,如果它的值内容为空,
就返回一个false。
定义一个Int类型变量,指向参数str的数据长度,
使用for循环语句进行遍历,i指向的是str参数的数据长度,
依次进行遍历,先获取str参数的第一个值1位,然后是第二个值…一直获取str参数全部值然后结束。
如果里面的值包括中文字符内容,就返回false:值不为数字,
不然的话即返回true:值为数字。

4.所涉及的另外一个类的一个方法:
还可以看到在StringUtil.isNumeric(String str)方法的源码中,
Character.isDigit(),

在这里插入图片描述
它的返回值也是boolean类型,
方法有一个参数,类型为char,
方法检测指定字符是否为数字。
如果字符为数字,则返回true;否则返回false。
ch为要进行检测的字符。
unicode是一个字符占据两个字节,如果是非常偏僻的字符,
就会占据4个字节。
由于此方法无法处理增补字符,若想要支持所有的Unicode字符,
包括增补字符,就需要使用isDigit(int)方法。
该方法return返回的就是isDigit()方法。

5.查看isDigit()方法的return 返回的isDigit()方法的源码:
在这里插入图片描述
该方法的返回值也是一个boolean类型,方法内有一个参数codePoint,
参数为int类型。该参数为要测试的字符(Unicode代码点),
return返回值:如果字符是数字,此方法返回true,否则返回false。
因为数字是由0-9组成的,所以,Character类中的这个常量
DECIMAL_DIGIT_NUMBER的赋值为9。
通过getType(codePoint) 提供的字符的常规类别为
DECIMAL_DIGIT_NUMBER,则字符为数字。

6.解决NumberFormatException异常:
调用StringUtils.isNumeric(String str)方法,
此方法是一个静态方法,返回值为boolean,
该方法就是对一个字符串进行判断,
判断它的值内容含不含中文字符,判断它是不是数字,如果为数字,
就为true,否则的话就为false。

所以,解决这个NumberFormatException异常,
主要是看StringUtils类下的静态方法isNumeric(String str)的用法,
和该方法的源码,以及过程如何实现。

猜你喜欢

转载自blog.csdn.net/zhang150114/article/details/88842931