2017年04月24日   码农之路   17,971 次浏览
刚刚解决了一个小异常:BindingException:Mapper method attempted to return null from a method with a primitive return type (int),接下来我们一起来剖析一下这个异常。
首先我们看到异常所在位置的源代码:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
final Class<?> declaringInterface = findDeclaringInterface(proxy, method);
final MapperMethod mapperMethod = new MapperMethod(declaringInterface, method, sqlSession);
final Object result = mapperMethod.execute(args);
if (result == null && method.getReturnType().isPrimitive() && !method.getReturnType().equals(Void.TYPE)) {
throw new BindingException("Mapper method '" + method.getName() + "' (" + method.getDeclaringClass() + ") attempted to return null from a method with a primitive return type (" + method.getReturnType() + ").");
}
return result;
}
我们看到这个异常的抛出条件:result == null && method.getReturnType().isPrimitive(),进一步跟跟踪isPrimitive方法,可以看到以下注释:
/**
* <p> There are nine predefined {@code Class} objects to represent
* the eight primitive types and void. These are created by the Java
* Virtual Machine, and have the same names as the primitive types that
* they represent, namely {@code boolean}, {@code byte},
* {@code char}, {@code short}, {@code int},
* {@code long}, {@code float}, and {@code double}.
*/
public native boolean isPrimitive();
好了,到这里我们就可以知道,如果mybatis的查询结果为null,并且返回值为boolean、int、long等java基本类型的时候就会报错了,为什么?因为这些基本类型无法赋值为null。
1、把返回值改为基本类型对应的封装类型,如boolean改为Boolean、int改为Integer,这里需要注意要对返回结果为null进行判断和处理;
2、处理查询结果为null时的默认值,比如我这里用到的是sum()函数,当数据库没有记录里sum()查询结果则为null,我通过nvl(sum(num),0)就把为null时的默认值设置为0了,这个大家可以具体情况具体分析。另:刚在oracle试了下,count()函数可以正常返回0,sum()、min()、max()不可以正常返回,大家以后遇到类似的用法是就要注意不要再出类似错误了。
>>> Hello World <<<
这篇内容是否帮助到你了呢?
如果你有任何疑问或有建议留给其他朋友,都可以给我留言。
目前有2条留言:
如果你确定有数据返回的话,就要看你的SQL是否正确呢?先在工具里检查下SQL结果集是否有空值。
插入一天数据不是返回一吗,为什么int 不行