如果可以使用以下代码:
Integer a = null;
int b = a;
这是否意味着为整数返回可能的null
值的函数是一种不好的做法?
编辑1: 这些答案有几种不同的意见。我没有足够的信心选择其中一种。
答案 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;
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);