如果以下代码是可能的:
Integer a = null;
int b = a;
这是否意味着返回null
整数可能值的函数是一种不好的做法?
编辑1:这些答案中有几种不同的意见。我没有足够的信心选择一个或另一个。
如果以下代码是可能的:
Integer a = null;
int b = a;
这是否意味着返回null
整数可能值的函数是一种不好的做法?
编辑1:这些答案中有几种不同的意见。我没有足够的信心选择一个或另一个。
该代码将NullPointerException
在您运行它时给出。它基本上相当于:
Integer a = null;
int b = a.intValue();
...这更清楚地表明它确实会失败。
您并没有真正为 an 分配空值int
- 您正在尝试并失败。
可以null
用作Integer
;的值 确实经常Integer
被使用而不是int
精确地用作“可空等价物”。
这不可能。你会得到NullPointerException
这将引发 NullPointerException。
原因是您依赖于将 Integer 值自动拆箱为 int 原始类型。Java 通过在内部调用.intValue()
为空的 Object 来做到这一点。
至于这是否是一个好习惯......我建议不要这样做,除非代码仅供您使用并且您表现得非常好,确保您只将此类方法的返回值分配给 Integer 值,而不是整数。
如果您的代码最终出现在其他人使用的库中,那是不安全的,我宁愿明确抛出一个异常,有据可查,并允许调用者进行防御性编码。
Java tenerary operator 的有趣之处?:(在 OSX 上使用 8u151)
如果你这样做
Integer x = map == null ? 0 : map.get ( key );
这看起来很好,很紧凑,然后你就得到了一个 npe !!!如果
map.get ( key )
是一个空值。所以我不得不把它分开,它工作得很好。
当然,您不能将 null 分配给 int。但是在某些情况下返回 null 是有道理的。Null 可能意味着未设置该值。一个典型的例子是一个 DB 列。
该代码是NullPointerException
可能的,但由于取消装箱,在运行时会抛出一个。关于
这是否意味着为整数返回可能的空值的函数是一种不好的做法?
是的。Integer
当 a足够时返回 a 是无用且危险的(如您所见)int
,因为对象可以为空,而原语不能。Integer
应仅在需要时使用,例如在参数化类型中 -List<Integer>
那确实可行。
Integer a = null;
Integer b = a;
但我宁愿使用超出范围的 int 值(如果您的数字都是正数,则为 -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>
您可以编写简单的测试:
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)
从 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);