JavaMessageFormat的坑现象某业务功能需要通过SSH协议执行命令查询一些数据,但是某查询没有得到任何结果,导致界面上没有数据,但是手动执行这条命令也是可以查询到数据的。翻了半天日志,也没看到日志有什么异常信息。我很困惑数据去了哪里???查了一会儿问题线路,还是没有头绪。这时候,我开始慌了。赶紧看了一眼提交记录,确认代码不是我写的,这才稍稍冷静了下来,人家问起就说不是我写的好办!虽然代码不是我写的,但是问题还是要看的。毕竟拿了钱,还要工作。那只能分析代码了。首先分析最容易出错的地方,就是解析命令查询的响应逻辑。把这个地方的代码和手动执行命令得到的结果一起分析,发现根据响应结果可以正常得到响应结果。看了一会,还真没发现什么问题,又看了看命令拼接的代码。拼接的逻辑只有一行,应该没有问题。没办法,只好又去看日志。这时候发现日志里有打印发送执行的命令。仔细一看,我擦,怎么多了一个逗号?他又擦了擦眼镜,确定自己没有看错。这个时候回过头来看代码。不管怎么看,都是MessageFormat有问题,但是一时半会找不到证据。publicIntegergetMaxIndex(){//返回最大索引值1035}publicStringqueyBySsh(){//这里期望连接的命令是showindex1035,但实际命令是showindex1,035//最后,还有许多命令一个英文逗号Stringcommand=MessageFormat("showindex{0}",getMaxIndex());//通过SSH执行这条命令查询}后来突然想起之前看过的一个wiki,好像有个说明是描述MessageFormat的事情。赶紧找找看,果然写着当MessageFormat的参数是数字类型时,当数字超过3位时,每3位多加一个逗号。所以按照上面代码的逻辑,结果是showindex1,035,结果里面多了一个英文逗号,手动执行拼接命令是查不到数据的。终于破案了,撒花撒花撒花!!!第一种方法解决方法是把数字转成字符串,然后格式化,修改上面代码如下:publicStringqueyBySsh(){//这里拼接的时候,先调用String.valueOf()方法Stringcommand=MessageFormat("showindex{0}",String.valueOf(getMaxIndex()));}方法二增加MessageFormat的FormatStyle,修改上面代码如下:publicStringqueryBySsh(){//这里#是定义的FamatStyleStringcommand=MessageFormat("showindex{0,number,#}",getMaxIndex());}
