int null java_Java中的int可以为null吗?

Java中的int是null吗?

例如:

int data = check(Node root);

if ( data == null ) {

// do something

} else {

// do something

}

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

我是在做家庭作业的,但是这部分内容不是家庭作业的一部分,它只是帮助我完成自己的工作。

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

这是编译时错误。

int不能为null,但Integer可以为null。在对空Integer装箱时,您需要小心,因为这会引起很多混乱和头部抓伤!

例如这个:

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

即使对象不为null也会给您NullPointerException!

为了跟进您的问题,如果您想表明没有值,我将调查java.util.Optional

存在Integer类的理由很充分,因此在迫切需要时使用它。

@ h2g2java:我希望您不要认为能够将它们与默认集合一起使用会很引人注目,因为对于HashMap 之类的东西,浪费的程度是巨大的且令人信服。这就是为什么Troves TIntIntHashMap仅使用原语绕圈非强制的HashMap 的原因。

不能检查int是否为null,但是,您可以通过将其强制转换为Integer将Java中的int安全地分配给int,例如,如果check(root)方法可以返回null,则可以通过执行以下操作将其安全地强制转换为int: int data = (Integer)check(node);

@sactiw-您能详细说明吗?我不确定我明白你的意思

@BrianAgnew让我纠正我在这里所说的错误,我是完全错误的,我基本上没有意识到int i = (Integer)null;在运行时将NPE拆箱时会扔掉NPE。

我建议使用IntOptional而不是Optional

如果您的意思是docs.oracle.com/javase/8/docs/api/java/util/OptionalInt.html,那也很有意义

否。只有对象引用可以为null,而不能为原语。

值得一提的是Integer类,如果OP希望使用null值,则该类更合适。或者他可以使用负值表示"未找到"

那你怎么办?

请使用Integer。

找出答案的好方法:

public static void main(String args[]) {

int i = null;

}

尝试编译。

实际上.. OP已经根据他的问题的最后一句话发现了自己:很容易发现它不起作用。

对于近四年后代来说-该位在以后的编辑中。

但是.. Integer ii = null; int i = ii;将编译,但在运行时抛出NullPointerException

在Java中,int是原始类型,因此不视为对象。只有对象可以具有空值。因此,您的问题的答案是否定的,不能为空。但这不是那么简单,因为有些对象代表大多数原始类型。

Integer类表示一个int值,但可以包含一个空值。根据您的check方法,您可能返回一个int或Integer。

这种行为与诸如Ruby之类的更纯粹面向对象的语言不同,在Ruby中,甚至"整数"之类的"原始"事物也被视为对象。

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

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

因此,默认情况下,

int a=0;

并不是

int a=null;

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

该代码甚至不会编译。像Integer一样,只有完整的Object可以是null。这是一个基本示例,显示何时可以测试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块。

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

不幸的是,如果" check"返回一个int而不是Integer,这将无济于事,因为int(不会为null)将自动装箱到Integer中。

h,这只是显示可以测试null的基本示例。另一方面,如果声明check返回int,则它永远不能为null,则整个if块都是多余的。

而不是将其声明为int i而不是将其声明为Integer i,那么我们可以执行i=null;

Integer i;

i=null;

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

public int getHeight(String name){

if(map.containsKey(name)){

return map.get(name);

}else{

return -1;

}

}

不可以,但是int []可以。

int[] hayhay = null; //: allowed (int[] is reference type)

int   hayno  = null; //: error   (int   is primitive type)

//: Message: incompatible types:

//: cannot be converted to int

任何原始数据类型(如int,boolean或float等)都不能存储null(侧向),因为Java提供了Wrapper类用于将相同的数据存储为int到Integer或boolean到Boolean。

例如:整数i = null;

在您的check()方法中检查null,并返回一个无效值,例如-1或如果为null则返回零。然后检查将针对该值,而不是传递null。这在过去的" C"中是正常的。

正如@Glen在评论中提到的那样,您基本上可以通过两种方式解决此问题:

使用"超出范围"值。例如,如果"数据"在正常使用中永远不会为负,则返回负值以表明它无效。

使用整数。只要确保" check"方法返回一个Integer,然后将其分配给Integer而不是int。因为如果在此过程中涉及" int",则自动装箱和拆箱会导致问题。

由于您要求实现目标的另一种方法,因此建议您使用包装器类:

new Integer(null);

那似乎不对

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

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

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

很简单,0与null不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值