2014-10-08 100 views
1
Map<String,Integer> m; 
m = new TreeMap<String,Integer>(); 

爲了避免m.get()爲null時的空指針異常,添加下面的轉換是不錯的做法。將int與可能爲空的Integer進行比較的最簡潔的方法是什麼?

System.out.println(((Integer) 8).equals(m.get("null"))); // returns false 

或者先前的空檢查它開始看起來有點醜。

System.out.println(m.contains("null") != null && m.get("null").equals(8)); 

有沒有更好的方法來寫這個?謝謝。

+0

這取決於人誰是來的剪紙。 – 2014-10-09 00:13:59

回答

2

我會盡量避免鑄件只要有可能,所以我寧願使用以下,這也看在我看來更好:

Integer.valueOf(8).equals(m.get("null")) 
+0

當然,他們最終會生成基本相同的代碼。 「演員」實際上是一個自動裝箱指令。 – 2014-10-09 00:16:28

+0

@HotLicks就是這樣,並且爲其相應的裝箱類型投下一個原語,即使是靜態類型檢查。由於文體原因,我仍然不喜歡它。 OP的代碼中更嚴重的問題當然是用'=='來比較'Integer'是否等於其他答案指出的。我必須承認,我忽略了乍看之下,只回答了他當前的質疑,即演員「是否被認爲是不良風格」(從那時起編輯的問題)。 – 5gon12eder 2014-10-09 01:36:03

+0

是的,我猜他最初使用'==',但很快就編輯了它。奇怪的是,它實際上是有效的,因爲它們實質上是「被實施」的,因爲它們對於小值積極的整數。 – 2014-10-09 01:38:07

1

如果只是其中一個參數可能是null(這是當你比較未知值恆定的情況下),使用equals()這樣的:

Integer foo = Integer.valueOf(8); // you could write Integer foo = 8; here too but I prefer to avoid autoboxing 
if (foo.equals(m.get("x"))) { //will never throw an NPE because foo is never null 
    ... 
} 

請注意,你的榜樣是不是因爲比較非基元值與==僅在引用同一個對象實例時才返回true。 (在這種情況下,對於非常特定的原因甚至可能是真實的,但大多數情況下不是)。

+0

這實質上是OP提出的。 – 2014-10-09 00:17:42

+0

@HotLicks這不是我寫回答時,OP編輯的問題。 – biziclop 2014-10-09 09:08:58

+0

是的,我同意這個問題從一開始就含糊其詞,他編輯了十幾遍。這個話題變得相當混亂。 – 2014-10-09 11:51:22

4

==運算符不會比較值,而是引用。

您應該使用.equals()法,而是適用於Integer變量(您確信不是null和NPE不會被拋出):

Integer eight = 8; //autoboxed 
System.out.println(eight.equals(m.get("null"))); 

這將打印falsem.get("null")返回null

2

沒有,因爲它不會工作。您無法將兩個Integer==進行比較,因爲它比較參考值而不是整數值。查看更多信息在this question

你需要一個輔助方法,如:

boolean safeIntegerCompare(Integer a, int b) 
{ 
    if (a != null) 
     return a.intValue() == b; 
    return false; 
} 
+0

我不相信他打算這麼做(儘管我承認他的全部意圖很難說清楚)。 – 2014-10-09 00:17:06

相關問題