当字符串为空但不为空时
介紹
我團隊中的一名初級程序員遇到了一個有趣的錯誤。 我已經不止一次看到它的癥狀。 這篇文章是尋找什么以及將來如何防止它。 我還將探討該問題的不同解決方案。
病征
有問題的代碼看起來做得不錯。:
if(trouble != null && !trouble.isEmpty()) { System.out.println(“fine here: ” + trouble); } else { System.out.println(“not so fine here: ” + trouble); }該代碼將命中“ fine here”塊,但將輸出“ null”值。 通過讀取文件來設置變量。
調查中
我和開發人員查看了打印件并進行了幾次測試,但結果卻相同。 我看了在哪里設置變量。 如果那里什么也沒有,它應該將值設置為null,但是打印輸出表明該值為null。 我有一個主意,我們決定進行測試。 他更改了代碼:
if(trouble != null && !trouble.isEmpty() && !trouble.equals(“null”)) { System.out.println(“fine here”); } else { System.out.println(“not so fine here”); }每次測試都進行到“這里不太好”。 似乎該值被設置為字符串“ null”而不是值null。
學什么
說實話,我以前已經看過了。 我花了大約一天的時間開始執行相同的代碼來弄清楚它。 我從中了解到,參數檢查仍然是一件好事。 我發現有效的字符串檢查可以在代碼中的多個地方使用。 為了防止復制和粘貼反模式,我將驗證抽象為一個方法。
private static boolean isValidString(String test) { boolean isValid = (test != null && !test.isEmpty() && !test.equals(“null”)); return isValid; }防止越來越長的驗證行的下一步是將其抽象到驗證對象。 這允許一個骯臟的單詞列表。
public class StringValidator { private List<String> dirtyWords;public static final int ARRAY_SIZE = 20; public StringValidator() { dirtyWords = new ArrayList(ARRAY_SIZE); }public boolean isValid(String test) { boolean isValid = false; isValid = (test != null) && !test.isEmpty(); if(isValid) { for(String word: dirtyWords) { if(word.equals(test)) { isValid = false; break; } } } return isValid; }public void addDirtyWord(String word) { if(!isValidString(word)){ throw new IllegalArgumentException(word + ” is not a good dirty word”); }dirtyWords.add(word); }private boolean isValidString(String test) { return ((test != null) && !test.isEmpty()); } }which leads to this parameter checking code:if(validator.isValid(trouble)) { System.out.println(“fine here”); } else { System.out.println(“not so fine here”); }結論
有時我們需要跳出框框思考一下問題。 讓您對問題有第二眼的感覺并不難; 這也許是發生的最好的事情。 我探索了最終創建驗證器的解決方案,該驗證器無需經過冗長而令人困惑的測試即可包含臟詞列表。
翻譯自: https://www.javacodegeeks.com/2014/10/when-a-string-is-null-but-not-null.html
總結
以上是生活随笔為你收集整理的当字符串为空但不为空时的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑极品飞车无限狂飙破解版(极品飞车无限
- 下一篇: SWT鼠标单击实现