Java中的int可以为null吗?


155

可以的intnull在Java中?

例如:

int data = check(Node root);

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

我的目标是编写一个返回的函数int。表示int存储在节点的高度,如果该节点不存在,它将为null,我需要检查一下。

我这样做是为了做作业,但是这部分内容不是家庭作业的一部分,它只是帮助我完成自己的工作。

感谢您的评论,但是似乎很少有人真正阅读过代码中的内容,我在问我如何才能实现这一目标;很容易发现它不起作用。


1
这是编译时错误。
2013年

Answers:


201

int 不能为null,但Integer 可以为null 。取消对空Integer装箱时,请务必小心,因为这会引起很多混乱和头部刮伤!

例如:

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

会给您一个NullPointerException,即使对象不为null!

为了跟进您的问题,如果您想表明没有值,我将进行调查java.util.Optional<Integer>


2
存在Integer类的理由很充分,因此在迫切需要时使用它。
Blessed Geek

6
@ h2g2java:我希望您不要认为能够将其与默认集合一起使用会很引人注目,因为对于HashMap <Integer,Integer>之类的东西,浪费的程度是巨大的,而且没有吸引力。这就是为什么Trove仅使用基元的TIntIntHashMap绕圈非强制的HashMap <Integer,Integer>的原因。
语法T3rr0r 2010年

1
无法检查int是否为null,但是,您可以通过将其强制转换为Integer将Java中的int安全地分配给int,例如,如果check(root)方法可以返回null,则可以通过执行类似的操作将其安全地强制转换为int这: int data = (Integer)check(node);
sactiw 2012年

@sactiw-您能详细说明吗?我不确定我能理解您的意思
Brian Agnew

7
@BrianAgnew让我纠正我在这里所说的错误,我是完全错误的,我基本上没有意识到int i = (Integer)null;在拆箱时会在运行时抛出NPE。
sactiw


31

找出答案的好方法:

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

尝试编译。


37
实际上.. OP已经根据他的问题的最后一句话发现了自己:很容易发现它不起作用。
BalusC

9
对于近四年后代来说-该位在以后的编辑中。
Matt Luongo 2013年

3
但是.. Integer ii = null; int i = ii;将编译但在运行时抛出NullPointerException
premek.v 2016年

13

在Java中,int是原始类型,因此不视为对象。只有对象可以具有空值。因此,您的问题的答案是否定的,不能为空。但这不是那么简单,因为有些对象代表大多数原始类型。

Integer类表示一个int值,但它可以包含一个空值。根据您的check方法,您可能返回一个int或Integer。

这种行为与诸如Ruby这样的纯粹面向对象的语言不同,后者甚至将诸如int之类的“原始”事物也视为对象。


8

除了以上所有答案外,我也想补充这一点。

对于基本类型,我们有固定的内存大小,即对于int我们有4个字节,而char我们有2个字节。并且null仅用于对象,因为内存大小不固定。

因此,默认情况下,

   int a=0;

并不是

   int a=null;

与其他原始类型相同,因此null仅用于对象,而不用于原始类型。


5

该代码甚至不会编译。只有一个完全值得的人Object才能null这样Integer。这是一个基本示例,显示何时可以测试null:

Integer data = check(Node root);

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

另一方面,如果check()声明为return int,则它永远不可能null,并且整个if-else块都是多余的。

int data = check(Node root);

// do something

check()声明要返回时,自动装箱问题也不适用于此int。如果已返回Integer,则将NullPointerException其分配给int而不是时可能会有风险Integer。确实必须将其分配为an Integer并使用该if-else块。

要了解有关自动装箱的更多信息,请查看此《 Sun指南》


1
不幸的是,如果“ check”返回一个int而不是一个Integer,这将无济于事,因为int(不会为null)将自动装箱到Integer中。
Paul Tomblin'2

2
D'哦,这仅仅是一个基本的例子来说明,当你可以测试空。另一方面,如果将check声明为return int,则它永远不能为null,则整个if块都是多余的。
BalusC

3

而不是像int i声明那样声明,Integer i那么我们可以做i=null;

Integer i;
i=null;

2

整数对象将是最好的。如果必须使用原语,则可以使用用例中不存在的值。人们不存在负高,所以

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

1

不可以,但是int []可以。

int[] hayhay = null; //: allowed (int[] is reference type)
int   hayno  = null; //: error   (int   is primitive type)
                     //: Message: incompatible types: 
                     //: <null> cannot be converted to int

0

正如@Glen在评论中提到的那样,您基本上可以通过两种方式解决此问题:

  • 使用“超出范围”值。例如,如果“数据”在正常使用中永远不会为负,则返回负值以表明其无效。
  • 使用整数。只要确保“ check”方法返回一个Integer,然后将其分配给Integer而不是int。因为如果在此过程中涉及“ int”,则自动装箱和拆箱会导致问题。

0

在您的check()方法中检查null并返回一个无效值,例如-1或如果为null则返回零。然后检查将针对该值,而不是传递null。在旧的“ C”中这将是正常的事情。


0

任何原始数据类型(如int,boolean或float等)都不能存储null(侧向),因为java提供了Wrapper类用于将相同的数据存储到int到Integer或boolean到Boolean中。

例如:整数i = null;


0

一个int不为null,如果未初始化,则可能为0。如果希望整数能够为null,则需要使用Integer而不是int。原语不具有空值。默认的int值为0。

数据类型/默认值(用于字段)

int ------------------ 0

长---------------- 0L

浮点数0.0f

双------------- 0.0d

字符---------------'\ u0000'

字符串--------------- null

布尔值------------否


-2

由于您要求实现目标的另一种方法,因此建议您使用包装器类:

new Integer(null);

-17

我不是专家,但我确实相信nullint 的等效项是0

例如,如果您制作一个int[],则每个插槽都包含0与相对的null,除非您将其设置为其他名称。

在某些情况下,这可能有用。


很简单,0与null不同。
戴夫·古德柴尔德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.