为int分配空值

时间:2012-12-17 12:37:31

标签: java

如果可以使用以下代码:

Integer a = null;
int b = a;

这是否意味着为整数返回可能的null值的函数是一种不好的做法?

编辑1: 这些答案有几种不同的意见。我没有足够的信心选择其中一种。

10 个答案:

答案 0 :(得分:44)

该代码在运行时会给出NullPointerException。它基本上等同于:

Integer a = null;
int b = a.intValue();

......这使得它确实会失败更清楚。

你不是真的int分配一个空值 - 你正在尝试和失败。

null用作Integer的值可以。确实经常使用Integer代替int,而不是“可空的等价物”。

答案 1 :(得分:12)

这是不可能的。您将获得NullPointerException

答案 2 :(得分:6)

这将抛出NullPointerException。

这样做的原因是您依赖于将Integer值自动取消装箱到int基本类型。 Java通过在Object上内部调用.intValue()来做到这一点,它是空的。

至于它是否是一个好的做法...我建议不要这样做,除非代码仅由你使用并且你表现得非常好,确保你只分配这种方法的返回值到整数值,而不是int。

如果你的代码最终出现在别人使用的lib中,那就不安全了,我宁愿明确地抛出一个Exception,有很好的文档记录,并允许对调用者进行防御性编码。

答案 3 :(得分:2)

当然你不能将null赋给int。但在某些情况下返回null是有道理的。 Null可能意味着未设置该值。典型的例子是DB列。

答案 4 :(得分:2)

代码可能,但由于取消装箱,因此会在运行时抛出NullPointerException。关于

  

是否意味着函数返回一个可能的空值   整数是一种不好的做法?

是的,确实如此。当Integer足够时,返回int是无用且危险的(因为你可以看到),因为对象可以为null,而基元则不能。只应在需要时使用Integer,例如参数化类型 - List<Integer>

答案 5 :(得分:2)

Java内容运营商有趣吗?:(在OSX上使用8u151)

如果你这样做

Integer x = map == null ? 0 : map.get ( key );

看起来很精致和紧凑,然后你得到了一个!如果

map.get ( key )

是null。所以我不得不拆分它并且工作正常。

答案 6 :(得分:1)

这确实有用。

Integer a = null;
Integer b = a;

但是如果出现错误,我宁愿使用超出范围的int值(如果你的数字都是正数,则为-1)。

答案 7 :(得分:1)

这是一场回合Java自动拳击。

Integer a = null;
int b = a;

这段代码将a分配给b,实际编译器会这样做:int b = a.intValue(),所以这行会抛出NullPointerException;

代码:

Integer a = 1;

实际上会这样做:整数a = Integer.valueOf(1);

您可以使用 javap 查看已编译的虚拟机说明。

答案 8 :(得分:1)

你可以写简单的测试:

public class Test {
    public static void main(String[] args){
        Integer a = null;
        int b = a;

        System.out.println(b);
    }
}

输出是int b = a;

上的NullPointerException
Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

答案 9 :(得分:0)

从Java 8开始,我们可以使用Optional:

// example: if an Integer object is null, an int value could receive 0, for example:

Integer value = getSomeInteger (...); // (0, null, or some other numeric value)
int inteiro = Optional.ofNullable(value).orElse(0);