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

到此這篇關於Java使用MessageFormat應註意的問題的文章就介紹到這瞭,更多相關Java MessageFormat 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: