这个报错表示使用string的indexOf的时候没有找到对应的index,下标越界了(https://zhidao.baidu.com/question/306567663.html)
比如我从一个jsonObject或者map中通过get("key")来获取一个值,但是这个key其实不存在,结果其实是null
但是我用+"",将值变成了String类型,就会导致null拦截不到空数据,并且读取这个值的时候可能会发生数组下标越界的情况.
关于null和"null"的分析如下:
总结起来就是:
(1)get("key"),如果key不存在,结果是null
(2)get("key")+"",如果key不存在,打印的时候结果是null,但是实际上是"null"(即null拦截不住)
(3)+""之后即使前面接收的类型仍是Object,实际上是String的实例,所以equals不仅是比较内存地址,也能比较内容中的每个字节(Object的equals只比较地址,只有string的equals才会比较内容)
具体验证:
System.out.println("-------------------------------------------------------------------------------------");
//1.map的测试
Map<String, Object> map=new HashMap<>();
map.put("i1", "sds");
map.put("i2", "sds");
map.put("i3", "sds");
//1.1结果是null
System.out.println("----------map.get()的测试--------------------------------------------------------------");
Object objectOfMap1=map.get("i666");
System.out.println("objectOfMap1==="+objectOfMap1);
if (objectOfMap1==null) {
System.out.println("1.1----objectOfMap1==null");
}
if (!"null".equals(objectOfMap1)) {
System.out.println("1.1----!\"null\".equals(objectOfMap2)");
}
System.out.println("----------map.get()+\"\"的测试---------------------------------------------------------");
//1.2打印结果是null,但其实是"null",是string的实例(去equals里面打断点可以验证)
Object objectOfMap2=map.get("i666")+"";
System.out.println("objectOfMap2==="+objectOfMap2);
if (objectOfMap2!=null) {
System.out.println("1.2----objectOfMap2!=null");
}
if ("null".equals(objectOfMap2)) {
System.out.println("1.2----\"null\".equals(objectOfMap2)");
}
System.out.println("-------------------------------------------------------------------------------------");
//2.com.alibaba.fastjson的测试
JSONObject jObject=new JSONObject();
jObject.put("i1", "sds");
jObject.put("i2", "sds");
jObject.put("i3", "sds");
//1.1结果是null
System.out.println("----------jObject.get()的测试-----------------------------------------------------------");
Object objectOfJson1=jObject.get("i666");
System.out.println("objectOfJson1==="+objectOfJson1);
if (objectOfMap1==null) {
System.out.println("2.1----objectOfJson1==null");
}
if (!"null".equals(objectOfMap1)) {
System.out.println("2.1----!\"null\".equals(objectOfJson1)");
}
//1.2打印结果是null,但其实是"null",是string的实例(去equals里面打断点可以验证)
System.out.println("----------jObject.get()+\"\"的测试------------------------------------------------------");
Object objectOfJson2=jObject.get("i666")+"";
System.out.println("objectOfJson2==="+objectOfJson2);
if (objectOfMap2!=null) {
System.out.println("2.2----objectOfJson2!=null");
}
if ("null".equals(objectOfMap2)) {
System.out.println("2.2----\"null\".equals(objectOfJson2)");
}
System.out.println("---------------------------------------------------------------------------------------");
上述代码的if里面的打印语句都能执行,结果如下