2012-12-17 57 views
15

如果下面的代碼是可能的:分配一個空值到一個int

Integer a = null; 
int b = a; 

這是否意味着一個整數返回可能null值的函數是一個不好的做法?

編輯1: 這些答案中有幾種不同的意見。我沒有足夠的信心去選擇一個或另一個。

+5

null的發明者Tony Hoare稱這是他10億美元的錯誤。一般避免使用null。 –

+0

如果你需要知道價值是未知的,這是不錯的做法。 'NullPointerException'的異常處理可以合併到您的代碼中以反映缺失,將NULL INT轉換爲零等。[NULL](http://en.wikipedia.org/wiki/Null_%28SQL%29)是一個必要的罪惡,有些情況下,你需要清楚地識別一個未知的或缺乏價值,例如:我會結婚多少次,死亡日期等。 –

+0

@ TomHawtin-tackline所以我們只知道他是至少有一次是錯的,當時那不僅僅是爭論而是脫離主題。考慮到這個問題不是關於語言設計的,null是Java的非常重要的組成部分,它說明了語言設計者的信念也是無濟於事的。 – josefx

回答

38

該代碼在運行時會給出NullPointerException。它基本上相當於:

Integer a = null; 
int b = a.intValue(); 

......這使得它確實會失敗。

你不是真的將空值分配給int - 你在嘗試和失敗。

可以使用null作爲Integer的值;的確經常Integer被用來代替int正是爲「null的equivalent`。

+0

如果你的函數返回一個Integer,那麼當這個函數被調用時,它應該被賦值爲Integer而不是int,以避免這種異常。否則,這將是危險的沒有? – JohnJohnGa

+1

@JohnJohnGa:好的。但假設如果方法返回'Integer'而不是'int',那是故意*因爲它可能爲空。 –

+0

整型變量可能包含正數或負數自然數(...,-2,-1,0,1,2,...)。然而,值0(零)不是該變量不包含任何內容的正確表示(它包含值0,並且只有給定上下文中的約定可能暗示0表示「無」而不是實際表示):「無」 「東西」)。在許多情況下,還需要表示一個變量根本沒有被賦予任何價值的事實。這可以通過可空類型來實現。可空的整數可以用問號(int?x)來聲明。 –

12

這是不可能的。您將獲得NullPointerException

+0

取決於你如何定義可能的。它將成功編譯。 – JohnJohnGa

+5

@JohnJohnGa:在運行時出現'NullPointerException'。不確定你的意思。你想要正確的代碼或編譯的代碼嗎? – Cratylus

6

這將拋出一個NullPointerException。

這樣做的原因是,你依靠整數值的自動拆箱到int原始類型Java是通過在Object上內部調用.intValue()來實現的,它是null。

對於這是一個很好的做法或不是...我建議不要這麼做,除非代碼僅由您使用並且你的表現非常好,確保你只將這種方法的返回值賦給Integer值,而不是int。

如果你的代碼最終在別人使用的庫中,這是不安全的,我寧願明確地拋出一個異常,記錄良好,並允許在調用者的部分防禦性編碼。

2

當然,您不能將null分配給int。但在某些情況下返回null是有道理的。空值可能表示該值未設置。一個典型的例子是一個數據庫列。

2

代碼可能的,但在運行時拋出NullPointerException,因爲拆箱。關於

這是否意味着爲 整數返回一個可能的空值的函數是一個不好的做法?

是的,是的。如果int就足夠了,那麼返回Integer是沒用的也是危險的(因爲你可以看到),因爲對象可以爲null,而原語不能。 Integer應僅在需要時使用,如參數化類型 - List<Integer>

1

這樣做的確可行。

Integer a = null; 
Integer b = a; 

但我寧願用一個int值超出範圍(-1,如果你的號碼都爲正)時發生錯誤的情況下返回。

0

這是一個回合Java自動裝箱。

Integer a = null; 
int b = a; 

此代碼分配至b,實際上編譯器將執行此操作:INT B = a.intValue(),所以這條線拋出NullPointerException;

的代碼:

Integer a = 1; 

將真正做到這一點:整數A = Integer.valueOf(1);

您可以使用javap的看到編譯虛擬機指令

0

你可以寫簡單的測試:

public class Test { 
    public static void main(String[] args){ 
     Integer a = null; 
     int b = a; 

     System.out.println(b); 
    } 
} 

和輸出是int b = a;

Exception in thread "main" java.lang.NullPointerException 
    at Test.main(Test.java:11) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
1

一個NullPointerException有趣的事情與Java tenerary運營商?:(在OSX上使用8u151)

如果你

Integer x = map == null ? 0 : map.get (key); 

其中顯得精緻和緊湊,所有的,然後你會得到一個NPE!如果

map.get (key) 

是空的。所以我不得不拆分它,它運行良好。