Java中的int可以为null吗?

时间:2010-02-12 19:11:19

标签: java

Java中int可以null吗?

例如:

int data = check(Node root);

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

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

我这样做是为了完成家庭作业,但这个特定的部分不是作业的一部分,它只是帮助我完成我正在做的事情。

感谢您的评论,但似乎很少有人真正阅读过代码下的内容,我在问我怎样才能实现这一目标;很容易弄清楚它不起作用。

15 个答案:

答案 0 :(得分:174)

int 不能为空,但Integer 可以。拆箱null整数时你需要小心,因为这会导致很多混乱和头部刮伤!

e.g。这样:

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

会给你一个NullPointerException,尽管对象不是空的!

要跟进您的问题,如果您想表明某个值的缺席,我会调查java.util.Optional<Integer>

答案 1 :(得分:36)

没有。只有对象引用可以为null,而不是基元。

答案 2 :(得分:26)

找出答案的好方法:

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

尝试编译。

答案 3 :(得分:11)

在Java中,int是基本类型,它不被视为对象。只有对象可以具有空值。所以你的问题的答案是否定的,它不能为空。但事情并非如此简单,因为有些对象代表了最原始的类型。

Integer类表示一个int值,但它可以保存一个null值。根据您的check方法,您可能会返回int或Integer。

这种行为不同于一些更纯粹的面向对象的语言,比如Ruby,甚至像int这样的“原始”东西都被认为是对象。

答案 4 :(得分:8)

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

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

所以默认我们有,

   int a=0;

而不是

   int a=null;

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

答案 5 :(得分:5)

代码甚至不会编译。只有符合条件的Object可以是null,例如Integer。这是一个显示何时可以测试null的基本示例:

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,那么在将其分配给NullPointerException而不是int时,您可能会冒Integer的风险。将其指定为Integer并使用if-else块确实是强制性的。

要了解有关自动装箱的详情,请查看this Sun guide

答案 6 :(得分:3)

代替声明为int i而不声明为Integer i,我们可以做i=null;

Integer i;
i=null;

答案 7 :(得分:2)

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

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

答案 8 :(得分: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

答案 9 :(得分:0)

正如@Glen在评论中提到的,你基本上有两种解决方法:

  • 使用“越界”值。例如,如果“数据”在正常使用中永远不会为负数,则返回负值以表示它无效。
  • 使用整数。只需确保“check”方法返回一个Integer,然后将其分配给Integer而不是int。因为如果一路上涉及“int”,自动装箱和拆箱会导致问题。

答案 10 :(得分:0)

检查check()方法中的null并返回无效值(如-1)或零(如果为null)。然后检查将是该值而不是传递null。在过去的'C'中,这​​是正常的事情。

答案 11 :(得分:0)

任何原始数据类型(例如int,boolean或float等)都不能存储null(侧面),因为Java提供了Wrapper类用于将int存储为Integer,将布尔值存储为Boolean。

例如:Integer i = null;

答案 12 :(得分:0)

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

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

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

长---------------- 0升

float ---------------- 0.0f

double ------------- 0.0d

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

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

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

答案 13 :(得分:-2)

由于您要求另一种方法来实现目标,我建议您使用包装类:

new Integer(null);

答案 14 :(得分:-16)

我不是专家,但我相信int的null等价物是0

例如,如果您制作int[],则每个广告位都包含0而不是null,除非您将其设置为其他广告位。

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