【问题标题】:Can an int be null in Java?Java中的int可以为null吗?
【发布时间】:2011-01-16 07:13:46
【问题描述】:

int 在 Java 中可以是 null 吗?

例如:

int data = check(Node root);

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

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

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

感谢 cmets,但似乎很少有人真正阅读过代码中的内容,我在问我还能如何实现这个目标;很容易发现它不起作用。

【问题讨论】:

  • 编译时出错。

标签: java


【解决方案1】:

int不能为空,但Integer可以。拆箱空整数时需要小心,因为这会导致很多混乱和头疼!

例如这个:

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

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

为了跟进您的问题,如果您想指出一个值的不存在,我会调查java.util.Optional<Integer>

【讨论】:

  • Integer 类的存在是有充分理由的,所以在需要时使用它。
  • @h2g2java: 我希望你不要认为能够将它们与默认集合一起使用是令人信服的,因为对于像 HashMap 这样的东西来说,浪费的程度是巨大的并且没有说服力.这就是为什么 Trove 的 TIntIntHashMap 仅使用原语,围绕非强制 HashMap 运行。
  • 无法检查 int 是否为 null,但是,您可以安全地将 null 分配给 Java 中的 int,方法是将其强制转换为 Integer,例如,如果 check(root) 方法可以返回 null,那么您可以安全地通过执行以下操作将其转换为 int:int data = (Integer)check(node);
  • @sactiw - 你能详细说明一下吗?我不确定我是否理解您的意思
  • @BrianAgnew 让我纠正一下我在这里说的话,我完全错了,我基本上没有意识到int i = (Integer)null; 会在运行时在拆箱时抛出 NPE。
【解决方案2】:

没有。只有对象引用可以为空,不能为原语。

【讨论】:

  • 值得一提的是 Integer 类,如果 OP 想要一个空值,它会更合适。或者他可以使用负值表示“未找到”
【解决方案3】:

找出答案的好方法:

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

尝试编译。

【讨论】:

  • 实际上.. OP 已经根据他问题中的最后一句话自己发现了这一点:很容易发现它不起作用。
  • 对于近 4 年后的后代-该位在以后的编辑中。
  • 但是.. Integer ii = null; int i = ii; 将编译但在运行时抛出 NullPointerException
【解决方案4】:

在 Java 中,int 是基本类型,不被视为对象。只有对象可以具有空值。所以你的问题的答案是否定的,它不能为空。但这并不是那么简单,因为存在代表大多数原始类型的对象。

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

这种行为与一些更纯粹的面向对象语言(如 Ruby)不同,在这些语言中,甚至像 int 这样的“原始”事物也被视为对象。

【讨论】:

    【解决方案5】:

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

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

    所以默认情况下我们有,

       int a=0;
    

    而不是

       int a=null;
    

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

    【讨论】:

      【解决方案6】:

      代码甚至无法编译。只有完全有价值的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 块确实是强制性的。

      要了解有关自动装箱的更多信息,请查看this Sun guide

      【讨论】:

      • 不幸的是,如果“check”返回的是 int 而不是 Integer,这将无济于事,因为 int(不会为 null)将自动装箱到 Integer 中。
      • D'oh,这只是显示 何时 可以测试 null 的基本示例。另一方面,如果 check 被声明为返回int,它永远不能为空,那么整个 if 块就是多余的。
      【解决方案7】:

      与其声明为int i,不如将​​其声明为Integer i,然后我们可以使用i=null;

      Integer i;
      i=null;
      

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

          没有,但 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
          

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              【解决方案11】:

              在您的 check() 方法中检查 null 并返回无效值,例如 -1 或如果为 null 则返回零。然后检查该值而不是传递空值。这在过去的“C”中是很正常的事情。

              【讨论】:

                【解决方案12】:

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

                例如:整数 i=null;

                【讨论】:

                  【解决方案13】:

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

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

                  int ------------------ 0

                  长---------------- 0L

                  float ---------------- 0.0f

                  双 ------------- 0.0d

                  字符 --------------- '\u0000'

                  字符串 ---------------- 空

                  布尔值 ------------ 假

                  【讨论】:

                    【解决方案14】:

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

                    new Integer(null);
                    

                    【讨论】:

                      【解决方案15】:

                      我不是专家,但我相信 null 等效于 int 是 0

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

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

                      【讨论】:

                      • 很简单,0不等于null。
                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-01-08
                      • 2017-06-24
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-12-10
                      相关资源
                      最近更新 更多