Java 中 MessageFormat 的坑
问题景象
某个业务性能须要通过 SSH 协定执行命令查问一些数据,而某次查问竟然没有失去任何后果,导致界面没有任何数据,然而手动执行这个命令又是可能查问到数据的。刨了半天日志也的确没有看到日志外面有什么异样的信息,百思不得其解数据到底去哪里了???
问题排查
看了一段时间还是没有什么脉络,这个时候心田开始慌了。
连忙看了一下提交记录,确认了一下代码不是我写的,于是心里稍略微淡定了一点,他人问起也好说不是我写的嘛!
尽管代码不是我写的,然而问题还是要持续看的。毕竟拿了钱,就要干活的嘛。
接下来就只能剖析代码了。首先剖析了一下最有可能出错的中央,就是解析命令查问的响应逻辑。把这个中央的代码和手动执行命令失去的后果放在一起剖析,发现依据这个响应后果是可能失常的失去响应后果的。
看了一会儿也的确没有发现问题,又去看了一下命令拼接的代码,拼接的逻辑就一行,应该是不会出问题的。
没方法了,又去看了看日志,这个时候发现日志外面有打印发送执行的命令。定睛一看,我擦,咋多了个逗号呢?又揉了揉眼镜,确认本人没有看谬误。
这个时候再回去看一下代码,怎么看这个 MessageFormat
都有点问题,然而一时又找不到啥证据。
public Integer getMaxIndex() {// 返回最大的索引值 1035}
public String queyBySsh() {
// 这里冀望拼接的命令是 show index 1035,然而理论的命令却是 show index 1,035
// 最终失去的命令多了个英文的逗号
String command = MessageFormat("show index {0}", getMaxIndex());
// 通过 SSH 执行这个命令查问
}
起初忽然想起来之前看到过的一个 Wiki,如同有对于形容 MessageFormat
的注意事项。连忙去找来看一下,果然外面有写到当 MessageFormat
的参数是数字类型时,当数字超过 3 位数字以上时,每隔 3 位会多减少一个因为的逗号。所以依据下面的代码逻辑失去的就是 show index 1,035
了,后果中多了个英文的逗号,而将这个拼接进去的命令手动执行是查不进去数据的。终于破案了,撒花,撒花,撒花!!!
如何解决
第一种办法是将数字转为字符串,而后再进行格式化,将下面的代码批改为如下:
public String queyBySsh() {// 这里拼接的时候先调用一下 String.valueOf() 办法
String command = MessageFormat("show index {0}", String.valueOf(getMaxIndex()));
}
第二种办法是减少 MessageFormat
的 FormatStyle
,将下面的代码批改为如下:
public String queyBySsh() {
// 这里的 # 就是定义的 FamatStyle
String command = MessageFormat("show index {0, number, #}", getMaxIndex());
}