有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将空对象转换为整数

我正在努力理解下面的代码。第2行输出null,而第3行抛出NullPointerException。我错过了什么?从理论上讲,这应该是可行的

public static void main(String []args){

  1  Object[] obj = {null}; 
  2  System.out.println((Integer)obj[0]);  //Output null

  3  Integer n = obj[0] == null ? (Integer)obj[0] : 1; //NullPointerException
  4  System.out.println(n);
 }

共 (2) 个答案

  1. # 1 楼答案

    根据JLS中定义的规则,三元条件运算符的类型

    null ? (Integer)obj[0] : 1;
    

    int,不是Integer

    因此,当这个表达式的结果是(Integer)obj[0]时,将Integer解绑到int,得到NullPointerException

    JLS 15.25. Conditional Operator ? :,表15.25-A:

    由于第二个操作数是Integer,第三个操作数是int,因此条件表达式类型是int

  2. # 2 楼答案

    这里的关键概念是binary numeric promotion

    为运算符提供不同类型的操作数时,必须将操作数转换为彼此兼容。此转换的条件运算符规则相当复杂;但当操作数类型不同且可转换为数字时,将应用二进制数字提升

    在提供一个装箱操作数和一个基本操作数的情况下,二进制数值提升的效果是尝试取消装箱操作数的装箱,而不是以装箱基本操作数

    您可以使用其他多操作数运算符观察二进制数字提升,例如+

    System.out.println(1 + (Integer) null); // NullPointerException!
    

    使用条件运算符时,如果显式框选1,则不会得到NPE,因为操作数不是不同的类型:

    Integer n = obj[0] == null ? (Integer)obj[0] : Integer.valueOf(1);