2010-06-23 85 views
8

字符串比較中文字的正確位置是什麼?

if (localName.equals("TaxName")) { 

但PMD說

Position literals first in String comparisons 
+1

好吧,如果PMD抱怨文字在右邊,我不認爲你有更多的選擇,而不是把它們放在左邊(又名[亞達條件](http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined/2430307#2430307)風格):) – 2010-06-23 20:58:53

回答

23

"TaxName".equals(localName)是更好,因爲如果localName爲空,你不會得到一個空指針異常。

+4

這隻有更好,如果你想允許的話。就我個人而言,我不記得在我的代碼中沒有錯誤,我想盡快趕上這種情況。 – Davor 2014-10-13 10:48:50

+0

正則表達式替換那些: '([a-zA-Z] [^] +)等於\((「[^」] *「)\)' 替換爲:\ \ 2.equals(\ 1 )' – Kuronashi 2017-10-13 09:17:49

5

我寧願位置文字第一,即:

if ("TaxName".equals(localName)) { ... 

這樣,你做的不是得到NullPointerException異常爲空的情況下,正確的比較。

7

PMD也應該告訴你爲什麼它會產生這個警告。從the rules documentation的PMD網站:

位置文本首先在字符串比較 - 如果String爲null,你不會得到一個NullPointerException這種方式,它只會返回false。

+1

在某些情況下,如果一個變量爲空,代碼應該將它視爲不等於一個字符串,而在其他情況下,它表示一個問題,並且標記問題越快,越好;在後一種情況下,'variable .equals(「literal」)'更好,因爲它會在變量爲空時陷阱。 – supercat 2014-05-03 02:50:36

2

個人而言,這對我沒有意義。如果代碼捕獲到一個NullPointerException,那麼它就完成了以後不需要做的工作。如果localName最終爲null,並且稍後會導致問題,那麼跟蹤會更困難。不要更改代碼以使編譯器高興。如果你的代碼拋出一個NullPointerException,那麼以後它會保存你的調試時間。

+0

我完全不同意,絕對寧願編寫'CONSTANT.equals(變量)'而不是做初步的'null'檢查 – 2010-06-23 21:01:07

+0

If localName是空的,你稍後嘗試使用它會得到與原始代碼完全相同的效果,即NPE。但更重要的是,應該始終讓編譯器高興 - 它知道它在做什麼,我甚至會推薦進入所選IDE的編譯器設置並升級所有這些c ompiler警告錯誤。 – CurtainDog 2010-06-23 21:05:54

+1

@CurtainDog將編譯器警告升級爲錯誤將有效拖延我公司一年的生產力。我敢肯定90%的人會同意。我並不是說你原則上不對,因爲這些警告經常變成錯誤,我只是說,說起來容易做起來難。 – corsiKa 2010-06-23 21:17:20

-1

爲了避免這種警告,一個簡單的解決方案是之前,至極的我們管理,每一個對象,建議檢查nullpointers不僅在這個情況下:

if (localName!=null && localName.equals("TaxName")) { 
    ... 
}