在 Java 中 int 可以为 null 吗?

在 Java 中 int可以是 null吗?

例如:

int data = check(Node root);


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

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

我这样做是为了家庭作业,但这个具体的部分不是家庭作业的一部分,它只是帮助我通过我正在做什么。

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

440212 次浏览

不,只有对象引用可以是 null,而不是原语。

找到答案的好方法:

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

尝试编译。

在 Java 中,int 是一个基元类型,它不被认为是一个对象。只有对象可以有空值。所以你的问题的答案是否定的,它不可能为空。但事情没那么简单,因为有些对象代表了最基本的类型。

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

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

代码根本无法编译。只有一个完整的 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,那么当你将它分配给 int而不是 Integer时,你可能会冒险使用 NullPointerException。将它指定为 Integer并使用 if-else块,那么确实是强制性的。

要了解更多关于自动装箱,请检查 这个太阳指南

int 不行是空的,但是 Integer 可以。在取消装箱空整数时,您需要小心,因为这可能会导致很多混乱和头痛!

例如:

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

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

为了跟进你的问题,如果你想指出一个值的 缺席,我将调查 java.util.Optional<Integer>

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

  • 使用“出界”值。例如,如果“ data”在正常使用中永远不能为负,那么返回一个负值来表明它是无效的。
  • 使用整数。只要确保“ check”方法返回一个 Integer,然后将它赋值给一个 Integer 而不是一个 int。因为如果一直使用“ int”,那么自动装箱和取消装箱可能会导致问题。

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

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

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

例如,如果您创建一个 int[],每个槽包含 0而不是 null,除非您将其设置为其他值。

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

随着以上所有的回答,我想补充这一点太。

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

所以默认情况下,

   int a=0;

而不是

   int a=null;

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

检查 Check ()方法中是否为 null,如果为 null,则返回无效值,如 -1或0。然后检查将针对该值,而不是传递 null。在过去的“ C”时代,这是很正常的事情。

既然你要求另一种方法来实现你的目标,我建议你使用一个包装类:

new Integer(null);

不,但 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

而不是声明为 int i声明为 Integer i然后我们可以做 i=null;

Integer i;
i=null;

任何像 int、 Boolean 或 float 这样的基本数据类型都不能存储 null (横向) ,因为 Java 已经提供了 Wrapper 类来将 int、 Boolean 和 Boolean 这样的数据类型存储为 Integer。

例如: 整数 i = null;

Int 不是 null,如果没有初始化它可能是0。如果希望整数能够为 null,则需要使用 Integer 而不是 int。原语没有空值。对于 int 类型,默认值为0。

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

Int ——————0

长——————0L

浮动——————0.0 f

双——————0.0 d

Char ————————-’u0000’

字符串—————— null

布尔型————错误