Java中的int可以为null吗?

use*_*755 147 java

可以的intnull在Java中?

例如:

int data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Bri*_*new 187

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

例如:

int a = object.getA(); // getA returns a null Integer
Run Code Online (Sandbox Code Playgroud)

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

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

  • @ h2g2java:我希望你不会认为能够将它们与默认集合一起使用是令人信服的,因为对于像HashMap <Integer,Integer>之类的东西来说,浪费的程度是巨大而且不引人注目的.这就是为什么Trove的TIntIntHashMap只使用基元来绕过非引人注目的HashMap <Integer,Integer>. (6认同)
  • @BrianAgnew让我纠正我在这里所说的,我是完全错的,我基本上没有意识到`int i =(Integer)null;`将在运行时抛出NPE,同时取消装箱. (6认同)
  • Integer 类的存在是有充分理由的,因此在需要时使用它。 (2认同)

Ign*_*ams 38

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

  • 如果OP想要一个空值,那么值得一提的是Integer类更适合.或者他可以使用负值来表示"未找到" (3认同)

Mat*_*ngo 30

一个很好的方法来找出:

public static void main(String args[]) {
    int i = null;
}
Run Code Online (Sandbox Code Playgroud)

尝试编译.

  • 实际上...... OP已经根据他的问题中的最后一句话发现了自己:*很容易弄清楚它不起作用.* (35认同)
  • 对于后人近4年后 - 这个位在后来的编辑中. (9认同)
  • 但是。`Integer ii = null; int i = ii;`将编译,但在运行时抛出NullPointerException (3认同)

Jon*_*ust 13

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

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

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


Sho*_*ate 8

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

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

所以默认我们有,

   int a=0;
Run Code Online (Sandbox Code Playgroud)

并不是

   int a=null;
Run Code Online (Sandbox Code Playgroud)

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


Bal*_*usC 5

代码甚至不会编译.只有一个fullworthy Object可以nullInteger.这是一个显示何时可以测试null的基本示例:

Integer data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果check()声明返回int,它永远不会null,整个if-else块是多余的.

int data = check(Node root);

// do something
Run Code Online (Sandbox Code Playgroud)

check()声明返回时,自动装箱问题也不适用于此处int.如果它已经返回Integer,那么NullPointerException在将其分配给int而不是时,您可能会冒险Integer.然后将其分配为Integer并使用该if-else块确实是强制性的.

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

  • 噢,这只是一个基本的例子来显示**当**你可以测试null.另一方面,如果声明check返回`int`,它永远不会为null,整个if块就是多余的. (2认同)

小智 5

而不是int iInteger i我们可以做的那样声明为i=null;

Integer i;
i=null;
Run Code Online (Sandbox Code Playgroud)