以后在SpringMvc接受参数的时候,尽量不要使用基本数据类型!

146 阅读2分钟

问题抛出

image.png

Optional int parameter 'currpage' is present but cannot be translated into a null value due to being dec

大意是说 如果参数是非必须的,则会赋值为null,因此参数应该是一个object,它才能接受这个null值。

而上面代码参数currpage的类型 为 int,它接受不了null值。

解决方法:

将int改为对象类型Integer

详解

1、当 controller 方法中的参数类型为基本数据类型时。如果页面提交过来的数据为 null 或 "", 会出现数据转换的异常。
IllegalStateException

2、当 controller 方法中的参数类型为基本数据类型的包装类型时,页面传递过的数据可以为 "",null 或无该参数提交。当此方法执行时,该包装类型参数自动设为 null (包装类可以设为 null)。如果被其他方法调用可能抛空指针异常。比如 Controller 方法中存在一个 Long parentId 参数,如果页面没有提交该参数。则 parentId 自动被设置为 null。

注意,如果使用值为 null 的包装类型进行拆包时,会抛空指针异常。当将 parentId (null) 作为参数传递到某方法中时 (该方法中的参数为基本数据类型), 编译时不会抛异常。但是运行时,此包装类型的参数 (null) 会进行拆包,此时会抛空指针异常!此异常为运行时异常。当然,如果直接将此 parentId 与基本数据类型运算,同样也会抛空指针异常。

null的拆包

总结:
1、如果使用基本数据类型,无法接受 null 值和 "" 值。可能发生数据转换异常;
2、 如果使用包装类型,可以接受 null 值和 ""值,但是可能在参数传递时发生空指针异常。解决办法是在此变量在方法间传递时,全部使用包装类型。这样,此参数可以接收页面传递的"" 或 null 值。这样,调用此参数发生异常时,会在问题位置抛出。