博客 / 詳情

返回

Java中MessageFormat的坑

Java中MessageFormat的坑

問題現象

某個業務功能需要通過SSH協議執行命令查詢一些數據,而某次查詢居然沒有得到任何結果,導致界面沒有任何數據,但是手動執行這個命令又是能夠查詢到數據的。刨了半天日誌也確實沒有看到日誌裏面有什麼異常的信息,百思不得其解數據究竟去哪裏了???

1

問題排查

看了一段時間還是沒有什麼頭緒,這個時候內心開始慌了。

image-20220619144748654

趕緊看了一下提交記錄,確認了一下代碼不是我寫的,於是心裏稍稍微淡定了一點,別人問起也好説不是我寫的嘛!

03

雖然代碼不是我寫的,但是問題還是要繼續看的。畢竟拿了錢,就要幹活的嘛。

04

接下來就只能分析代碼了。首先分析了一下最有可能出錯的地方,就是解析命令查詢的響應邏輯。把這個地方的代碼和手動執行命令得到的結果放在一起分析,發現根據這個響應結果是能夠正常的得到響應結果的。

看了一會兒也確實沒有發現問題,又去看了一下命令拼接的代碼,拼接的邏輯就一行,應該是不會出問題的。

沒辦法了,又去看了看日誌,這個時候發現日誌裏面有打印發送執行的命令。定睛一看,我擦,咋多了個逗號呢?又揉了揉眼鏡,確認自己沒有看錯誤。

6

這個時候再回去看一下代碼,怎麼看這個 MessageFormat 都有點問題,但是一時又找不到啥證據。

public Integer getMaxIndex() {
    // 返回最大的索引值 1035
}
public String queyBySsh() {
    //  這裏期望拼接的命令是 show index 1035,但是實際的命令卻是 show index 1,035
    // 最終得到的命令多了個英文的逗號 
    String command = MessageFormat("show index {0}", getMaxIndex());
    // 通過SSH執行這個命令查詢
}

9

後來突然想起來之前看到過的一個Wiki,好像有關於描述 MessageFormat 的注意事項。趕緊去找來看一下,果然裏面有寫到當 MessageFormat 的參數是數字類型時,當數字超過 3 位數字以上時,每隔 3 位會多增加一個因為的逗號。所以根據上面的代碼邏輯得到的就是 show index 1,035 了,結果中多了個英文的逗號,而將這個拼接出來的命令手動執行是查不出來數據的。終於破案了,撒花,撒花,撒花!!!

如何解決

第一種方法是將數字轉為字符串,然後再進行格式化,將上面的代碼修改為如下:

public String queyBySsh() {
    // 這裏拼接的時候先調用一下 String.valueOf() 方法
    String command = MessageFormat("show index {0}", String.valueOf(getMaxIndex()));
}

第二種方法是增加 MessageFormatFormatStyle,將上面的代碼修改為如下:

public String queyBySsh() {
    // 這裏的 # 就是定義的 FamatStyle
    String command = MessageFormat("show index {0, number, #}", getMaxIndex());
}
user avatar codingdgsun 頭像 mo_or 頭像 lingfeng23 頭像 91cyz 頭像 saoming_zhang 頭像 async_wait 頭像 tangtaixian_5fc4b5d1c3eff 頭像 nahandechaomian 頭像 iot_full_stack 頭像 u_16656615 頭像
10 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.