2010-02-12 107 views
118

在Java中可以使用intnull嗎?Java中的int可以爲null嗎?

例如:

int data = check(Node root); 

if (data == null) { 
// do something 
} else { 
// do something 
} 

我的目標是寫一個返回int的功能。所述int被存儲在節點的高度,並且如果該節點不存在,則它將是空的,並且我將需要檢查該節點。

我正在做這個作業,但這個特定的部分不是作業的一部分,它只是幫助我度過我正在做的事情。

感謝您的評論,但似乎很少有人真正閱讀過代碼下的內容,我在問我該如何實現這一目標;很容易發現它不起作用。

+1

這是編譯時錯誤。 – MayurB 2013-03-01 12:23:12

回答

151

int不能爲空,但Integer可以。拆箱時需要小心,因爲這可能會導致很多混亂和頭部劃痕!

例如這個:

int a = object.getA(); // getA returns a null Integer 

會給你一個NullPointerException,儘管對象不是null!

要在你的問題跟進,如果你想表示一個值的沒有,我將調查java.util.Optional<Integer>

+1

Integer類存在很好的理由,所以當需求引人注目時就使用它。 – 2010-02-12 19:27:25

+6

@ h2g2java:我希望你不會認爲能夠將它們與默認集合一起使用是非常有吸引力的,因爲對於像HashMap 這樣的東西來說,浪費水平是巨大的,並且不具有吸引力。這就是爲什麼Trove的TIntIntHashMap只使用基元,圍繞非引人注目的HashMap 運行。 – SyntaxT3rr0r 2010-02-12 20:02:12

+1

int不能被檢查爲null,但是,通過將null轉換爲Integer,可以安全地將null分配給int,例如,如果check(root)方法可以返回null,那麼您可以通過執行某些操作將其安全地轉換爲int像這樣: 'int data =(Integer)check(node);' – sactiw 2012-10-11 14:06:15

33

不。只有對象引用可以是null,而不是基元。

+3

值得一提的是,如果OP想要一個空值,Integer類將會更適合。或者他可以使用負值表示「找不到」 – Glen 2010-02-12 19:13:57

+0

那麼你做什麼? – user220755 2010-02-12 19:14:48

+1

改用'Integer'。 – 2010-02-12 19:15:52

27

一個偉大的方式,找出:

public static void main(String args[]) { 
    int i = null; 
} 

嘗試編譯。

+27

其實..根據他的問題中的最後一個短語,OP已經發現自己了:*很容易發現它不起作用。* – BalusC 2010-02-12 19:35:05

+7

近4年後的後代 - 這一點在後面的編輯中。 – 2013-12-19 21:36:13

+1

但是...... Integer ii = null; int i = ii;'會編譯但在運行時拋出NullPointerException – 2016-02-25 16:50:07

11

在Java中,int是一個原始類型,它不被視爲一個對象。只有對象可以具有空值。所以你的問題的答案是否定的,它不能爲空。但事情並非如此簡單,因爲存在代表最原始類型的對象。

Integer類表示一個int值,但它可以包含一個空值。根據你的check方法,你可能會返回一個int或一個Integer。

這種行爲不同於一些更純粹的面向對象的語言,比如Ruby,即使是像原子一樣的「原始」事物也被認爲是對象。

5

代碼甚至不會編譯。只有一個完整的Object可以是null,比如Integer。這裏有一個基本的例子來說明,當你可以測試空:

Integer data = check(Node root); 

if (data == null) { 
// do something 
} else { 
// do something 
} 

在另一方面,如果check()聲明爲返回int,它可以永遠null,整個if-else塊是那麼多餘。

int data = check(Node root); 

// do something 

自動裝箱問題也時check()聲明爲返回int不是在這裏也適用。如果它已返回Integer,那麼當將其分配給int而不是Integer時,您可能冒NullPointerException。將它分配爲Integer並使用if-else塊將確實是強制性的。

要了解更多有關自動裝箱的信息,請查詢this Sun guide

+1

不幸的是,如果「check」返回一個int而不是Integer,這將無濟於事,因爲int(它不會爲空)會自動裝入整數。 – 2010-02-12 19:16:04

+2

D'oh,這只是一個基本的例子,當**你可以測試null時顯示**。另一方面,如果check被聲明返回'int',那麼它永遠不能爲null,並且整個if塊是多餘的。 – BalusC 2010-02-12 19:17:05

0

由於@Glen在評論中提到,你基本上圍繞這兩種方式:

  • 使用「超出界限」值。例如,如果「數據」在正常使用中永遠不能爲負數,則返回一個負值表示它無效。
  • 使用整數。只要確保「檢查」方法返回一個整數,並將其分配給整數而不是整數。因爲如果在整個過程中涉及「int」,自動裝箱和拆箱可能會導致問題。
1

整數對象是最好的。如果您必須使用原語,則可以使用您的用例中不存在的值。負高度不存在的人,所以

public int getHeight(String name){ 
    if(map.containsKey(name)){ 
     return map.get(name); 
    }else{ 
     return -1; 
    } 
} 
-14

我不是專家,但我確實認爲,null相當於一個int是0

例如,如果您製作int[],每個插槽包含0而不是null,除非您將其設置爲其他內容。

在某些情況下,這可能是有用的。

6

除了上述所有答案,我還想補充一點。

對於原始類型,我們有固定的內存大小,即對於int,我們有4個字節,char有2個字節。而null僅用於對象,因爲內存大小不固定。

所以在默認情況下,我們有,

int a=0; 

,而不是

int a=null; 

同其他原始類型,因此空只用於對象而不是原始類型。

0

在check()方法中檢查null並返回無效值,例如-1或零(如果爲null)。然後檢查將是爲了該值,而不是傳遞零。這在以前的'C'中是很正常的事情。

-1

既然你問到了另一種方式來實現自己的目標,我建議你使用一個包裝類:

new Integer(null). 
相關問題