今天帮同事debug,问题描述:判断相应条件之后,没有按照预想的结果接入if语句中;
其代码如下:
Map<String, Object> alarmByAlarmNum = alarmMapper.getAlarmByDeviceNumber(deviceNumber);
.....
if(alarmByAlarmNum==null||alarmByAlarmNum.size()<=0||"1".equals(alarmByAlarmNum.get("alarm_state"))){
//发送告警
sendDeviceWarn(lonLat,alarmNum,deviceMap,deviceNumber,deviceType);
}
由于本地操作无法开启debug模式,加输出语句如下,在服务器观察输出情况:
Map<String, Object> alarmByAlarmNum = alarmMapper.getAlarmByDeviceNumber(deviceNumber);
.....
System.out.println(alarmByAlarmNum.get("alarm_state")); //输出 1
if(alarmByAlarmNum==null||alarmByAlarmNum.size()<=0||"1".equals(alarmByAlarmNum.get("alarm_state"))){
//发送告警
sendDeviceWarn(lonLat,alarmNum,deviceMap,deviceNumber,deviceType);
}
上面打印输出1,下面比较后却没有进入if方法体,问题就出来了,“1”和输出的那个“1”,比较结果出问题了。
我随手加上.toString(),问题解决。
Map<String, Object> alarmByAlarmNum = alarmMapper.getAlarmByDeviceNumber(deviceNumber);
.....
System.out.println(alarmByAlarmNum.get("alarm_state")); //输出 1
if(alarmByAlarmNum==null||alarmByAlarmNum.size()<=0||"1".equals(alarmByAlarmNum.get("alarm_state").toString())){
//发送告警
sendDeviceWarn(lonLat,alarmNum,deviceMap,deviceNumber,deviceType);
}
那么究竟是为什么出现这个问题的呢?这还得从equals方法说起:
1、equals方法是Object类的,原方法比较的是两个对象是否为统一内存地址,对于任何非空参考值x
和y
,当且仅当x
和y
引用相同对象( x == y
具有值true
)时,该方法返回true
;
2、String中重写了这个方法,public boolean equals(Object anObject)
将此字符串与指定对象进行比较。 如果且仅当参数不是null
且是表示与该对象相同的字符序列的String
对象时,结果为true
。
3、也就是说,在上面的代码中,只有当 alarmByAlarmNum.get("alarm_state") 代表的是“1”这个字符串序列的时候,结果才是true,那么明明输出的是“1”啊,为什么还是false呢? 原因就在于
- public void println(Object x)
- 打印一个对象,然后终止该行。 此方法首先调用String.valueOf(x)来获取打印对象的字符串值,然后表现为调用
print(String)
然后println()
。
4、这里容易造成误解的就是输出的结果看起来一样,但是实际alarmByAlarmNum.get("alarm_state")代表的是一个对象,而调用Object 的toString()方法才是对象的字符串表示形式。
- public String toString()
- 返回对象的字符串表示形式。