说明:记录一次使用String.valueOf()的坑,以下是一段有问题的代码:
String count = String.valueOf(listData.get(0).get(0).get("count");
if (StringUtils.isBlank(count) || "0".equals(count)) {
result.setResult(page);
return result;
}
问题分析
其中,listData是调用数据库存储过程,返回的数据集合,是List<List<Map<String,String>类型的,表示多个结果集,每个结果集有多条数据,而结果集1,通常表示记录的总条数,即count;
这段代码就是将第1个结果集中的count字段值获取出来,并转换为字符串。
正常情况,这段代码是没有问题的,后面也对count的值做了校验,如果count值为null或者0(StringUtils.isBlank(count)
),都不会往下走;
现在的问题是,当listData中,第1个结果集中没有count时,这段代码就有问题了。
问题是这个方法,当调用存储过程返回的结果集中,没有count这个结果集,String.valueOf()里面的内容是null,所以String count会得到一个“null”字符串,而在下面的if判断中,StringUtils.isBlank(count)的返回结果会是false,这样就跳过了对count的空值判断。
String.valueOf()
为什么null会被转为一个字符串呢?我们分析一下这个方法,如下:
// 方式一:将一个对象赋值为null,然后调用String.valueOf()方法
String str = null;
System.out.println(String.valueOf(str));
// 方式二:直接将null作为参数传入
System.out.println(String.valueOf(null));
这两种方式,前一种会打印“null”,后一种会报空指针异常;
也就是说,声明了的对象,赋值为null,作为参数传入String.valueOf()会返回null字符串。所以在上面的代码中,不能使用String.valueOf()将取出的值再转为String类型。修改如下:
String count = listData.get(0).get(0).get("count");
if (StringUtils.isBlank(count) || "0".equals(count)) {
result.setResult(page);
return result;
}