Java中的int可以为null吗?

Java中的int可以为null吗?

例如:

 int data = check(Node root); if ( data == null ) { // do something } else { // do something } 

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

我这样做是为了做作业,但是这个具体的部分不是作业的一部分,它只是帮助我了解我正在做的事情。

感谢评论,但似乎很less有人真正阅读过代码中的内容,我在问怎么才能完成这个目标; 很容易发现它不起作用。

int 不能为null,但Integer 可以 。 拆箱时需要小心,因为这可能会导致很多混乱和头部划痕!

例如:

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

会给你一个NullPointerException ,尽pipe对象不是null!

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

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

一个很好的方法来找出:

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

尝试编译。

在Java中,int是一个基本types,它不被视为一个对象。 只有对象可以有一个空值。 所以你的问题的答案是否定的,它不能为空。 但事情并不那么简单,因为有代表最原始types的对象。

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

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

代码甚至不会编译。 只有一个完整的Object可以为null ,如Integer 。 下面是一个基本的例子,显示何时可以testingnull:

 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块将确实是强制性的。

要了解更多关于自动装箱的信息,请查看这本Sun指南 。

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

对于原始types,我们有固定的内存大小,即对于int我们有4个字节和字符我们有2个字节。 而null仅用于对象,因为内存大小不固定。

所以默认情况下,

  int a=0; 

并不是

  int a=null; 

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

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

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

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

  • 使用“越界”值。 例如,如果“数据”在正常使用中永远不能为负数,则返回一个负值表示它是无效的。
  • 使用整数。 只要确保“检查”方法返回一个整数,并将其分配给一个整数,而不是一个整数。 因为如果在整个过程中涉及“int”,自动装箱和拆箱可能会导致问题。

在check()方法中检查null,并返回一个无效的值,例如-1或零(如果为null)。 然后检查将是为了这个价值,而不是通过零。 这在以前的'C'中是正常的事情。

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

 new Integer(null). 

我不是专家,但我确实认为int的null等价为0

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

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