24

如果以下代码是可能的:

Integer a = null;
int b = a;

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

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

4

10 回答 10

49

该代码将NullPointerException在您运行它时给出。它基本上相当于:

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

...这更清楚地表明它确实会失败。

您并没有真正为 an 分配空值int- 您正在尝试并失败。

可以null用作Integer;的值 确实经常Integer被使用而不是int精确地用作“可空等价物”。

于 2012-12-17T12:39:12.720 回答
14

这不可能。你会得到NullPointerException

于 2012-12-17T12:38:50.600 回答
6

这将引发 NullPointerException。

原因是您依赖于将 Integer 值自动拆箱为 int 原始类型。Java 通过在内部调用.intValue()为空的 Object 来做到这一点。

至于这是否是一个好习惯......我建议不要这样做,除非代码仅供您使用并且您表现得非常好,确保您只将此类方法的返回值分配给 Integer 值,而不是整数。

如果您的代码最终出现在其他人使用的库中,那是不安全的,我宁愿明确抛出一个异常,有据可查,并允许调用者进行防御性编码。

于 2012-12-17T12:39:18.743 回答
3

Java tenerary operator 的有趣之处?:(在 OSX 上使用 8u151)

如果你这样做

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

这看起来很好,很紧凑,然后你就得到了一个 npe !!!如果

map.get ( key )

是一个空值。所以我不得不把它分开,它工作得很好。

于 2017-11-10T11:03:18.433 回答
2

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

于 2012-12-17T12:42:34.597 回答
2

该代码NullPointerException可能的,但由于取消装箱,在运行时会抛出一个。关于

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

是的。Integer当 a足够时返回 a 是无用且危险的(如您所见)int,因为对象可以为空,而原语不能。Integer应仅在需要时使用,例如在参数化类型中 -List<Integer>

于 2012-12-17T12:42:52.963 回答
1

那确实可行。

Integer a = null;
Integer b = a;

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

于 2012-12-17T12:43:18.963 回答
1

这是关于 Java 自动装箱的。

Integer a = null;
int b = a;

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

编码 :

Integer a = 1;

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

可以使用javap查看编译后的虚拟机指令。</p>

于 2012-12-17T13:01:16.060 回答
1

您可以编写简单的测试:

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

        System.out.println(b);
    }
}

并且输出是一个 NullPointerException onint b = a;

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)
于 2012-12-19T20:15:17.930 回答
1

从 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);
于 2019-03-27T19:21:25.903 回答