2010-02-12 401 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). 
相关问题