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());
}