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
,除非将其设置为其他值。
在某些情况下,这可能是有用的。
- “自动激活bundle com.android.ide.eclipse.adt时发生错误”
- 与圆angular和透明度的边界
- 是否有可能在java中做比较器,但实现自定义equals()和hashCode()
- 等待在sun.misc.Unsafe.park(本地方法)
- com.jcraft.jsch.JSchException:UnknownHostKey
- 在Spring Boot的application.properties中使用envvariables
- 在spring引导中将属性放在application.yml或bootstrap.yml之间有什么不同?
- java ArrayList的时间复杂度
- JVM是编译器还是解释器?