当前位置: 首页 > 面试题库 >

为什么我可以在三元运算中将原始类型设置为null

乜烨霖
2023-03-14
问题内容

我一直以为Java中的原始类型不能为null,因为如果我尝试执行以下操作,则会导致编译时错误:

int test = null;

但是,在三元运算中,似乎允许这样做:

int test = something != 0 ? 5 : null;

这不是三元运算的简称(在这种情况下):

int test;
if (something != 0){
    test = 5;
} else {
    test = null
}

当然不应该这样做。如果该条件失败,它将NullPointerException由于自动装箱而自动引发a
。那么,为什么Java编译器不会像这样获取废话呢?


问题答案:

发生的情况是Java编译器首先尝试使等式两边的表达式类型:相同。在这种情况下,它将自动装箱5Integer;请注意,这null是的有效值Integer。整个三元表达式的结果是Integer。您分配一个int,所以Integer随后autounboxed。

本质上,编译器会应用自动装箱和-unboxing,以便该行如下所示:

int test = (something != 0 ? Integer.valueOf(5) : null).intValue();

实际上,自动拆箱null会导致NullPointerException

那么,为什么Java编译器不会像这样获取废话呢?

因为Java语言的设计者以这样的方式定义了该语言,因此无需决定必须将其视为错误…

Java语言规范的15.25节解释了如何确定整个表达式的类型。



 类似资料:
  • 问题内容: 声明任何原始类型的数据(例如int或)时,它们会初始化为或。为什么我们不能将它们设置为? 问题答案: 基本类型就是数据。另一方面,我们称为对象的对象只是指向数据存储位置的指针。例如: 在这种情况下,它只是指向一个整数对象的指针,该对象的值恰好是3。也就是说,在存储变量对象的内存位置,你所拥有的只是对数据实际位置的引用。number另一方面,存储的存储位置直接包含值3。 因此,你可以将设

  • 当声明任何基本类型数据(如< code>int或< code>double)时,它们被初始化为< code>0或< code>0.0。为什么我们不能将它们设置为< code>null?

  • 问题内容: 如果有Wrapper类使Java成为纯面向对象的语言,那么为什么会有可在Java中使用的Primitive数据类型呢? 问题答案: 为了效率。基本类型的变量直接包含值。非基本类型的变量是引用,引用存储在内存中其他位置的对象。 每次您需要使用包装器类型的值时,JVM都需要在内存中查找对象以获取该值。对于原始类型,这不是必需的,因为变量本身包含值,而不是对包含该值的对象的引用。 但是,这不

  • 问题内容: 为什么大多数其他数据类型都没有Java的String基本类型? 问题答案: 字符串是一个对象,根本不是原始类型,只是一个字符数组。James Gosling的访谈 摘录摘述了Java中根本存在原始类型的原因,这很有趣。 Bill Venners: Java为什么会有原始类型?为什么不是所有事物都只是一个对象? James Gosling: 完全是效率问题。有各种各样的人已经建立了以in

  • 我刚刚安装了Ubuntu desktop 12.04并通过以下方式安装了Java 6 JDK: 但是当我转到时,我没有看到一个名为的目录,所以我认为它根本不存在!?! 当我转到时,我看到: 我现在正试图将作为环境变量添加到中,以便从基于shell的Ant构建中访问它: ? ? 还有别的吗? 我所说的“”是指我在系统上安装的JDK6的顶级目录,无论它在哪里······

  • 问题内容: 在Java中,我们可以直接用于声明字符串变量名称并指定其值。即使String是非原始数据类型,也不必通过使用new关键字将字符串定义为数组。 有人可以解释为什么String是非原始数据类型吗? 问题答案: 这是字符串文字。像这样声明字符串时,实际上是在String上调用intern()方法。此方法引用内部字符串对象池。如果已经存在一个字符串值“ This is stringlitera