首页 > 编程语言 >Java开发手册中为什么要求三目运算符必须要注意类型对齐

Java开发手册中为什么要求三目运算符必须要注意类型对齐

时间:2023-06-05 17:46:40浏览次数:45  
标签:拆箱 Java 运算符 三目 类型 Integer 表达式

场景

java开发手册中对于三目运算符的使用要求如下:

【强制】三目运算符 condition? 表达式 1 : 表达式 2 中,高度注意表达式 1 和 2 在类型对齐时,

可能抛出因自动拆箱导致的 NPE 异常。

说明:以下两种场景会触发类型对齐的拆箱操作:

1) 表达式 1 或表达式 2 的值只要有一个是原始类型。

2) 表达式 1 或表达式 2 的值的类型不一致,会强制拆箱升级成表示范围更大的那个类型。

 

下面看一个反例:

        Integer a = 1;
        Integer b = 2;
        Integer c = null;
        Boolean flag = false;
        Integer result = (flag?a*b:c);

上面写法会触发NullPointException-a*b的结果是int类型,那么c会强制拆箱成Int类型,抛出异常。

注意:

对于条件表达式b?x:y,先计算条件 b,然后进行判断。如果 b 的值为 true,

计算 x 的值,运算结果为 x 的值;否则,计算 y 的值,运算结果为 y 的值。

 一个条件表达式从不会既计算 x,又计算 y。

条件运算符是右结合的,也就是说,从右向左分组计算。例如,a?b:c?d:e 将按 a?b:(c?d:e)执行。

根据规定,三目运算符的第二、第三位操作数的返回值类型应该是一样的,这样才能当把一个三目运算符的结果赋值给一个变量。

如:Person i = a>b : i1:i2; ,就要求 i1 和 i2 的类型都必须是 Person才行。因为 Java 中存在一种特殊的情况,

那就是基本数据类型和包装数据类型可以通过自动拆装箱的方式互相转换。即可以定义 int i = new Integer(10);也可以定义Integer i= 10;

那如果,三目运算符的第二位和第三位的操作数的类型分别是基本数据类型和包装类型对象时,就需要有一方需要进行自动拆装箱。

根据三目运算符的语法规范,当第二,第三位操作数分别为基本类型和对象时,其中的对象就会拆箱为基本类型进行操作。

下面再看一个反例

        boolean b1 = true;
        boolean b2 = false;
        Boolean nullBool = null;
        boolean result = b1 ? nullBool : b2;

 


 

标签:拆箱,Java,运算符,三目,类型,Integer,表达式
From: https://www.cnblogs.com/badaoliumangqizhi/p/17458530.html

相关文章

  • C、C++、Java等控制汽车- 汽车引擎控制系统
    汽车代码的实现 - 汽车引擎控制系统汽车引擎控制系统是汽车代码中最重要的一部分之一。控制系统的目的是确保引擎在各种负载下运行顺畅,并最大程度地减少排放。控制系统的主要组成部分是ECU(电子控制单元),它是一种具有微处理器的电子设备,可接收传感器信号并控制汽车的各种功能,从燃......
  • 汽车代码的实现 - 车联网,需要Java、PHP、HTML、CSS
    汽车代码的实现 - 车联网车联网是另一个重要的汽车代码领域,它旨在将车辆、驾驶员和其他设备连接到互联网,以提高车辆性能和安全性,并实现大规模数据收集和分析。实现车联网需要使用多种编程语言和技术,如Java、PHP、HTML、CSS等。同时,还需要使用各种通信协议和技术,如Bluetooth、WIF......
  • 动力节点最新Java零基础笔记-③Java基础语法
    标识符(掌握)什么是标识符在Java中,标识符是用来给变量、方法、类和包等命名的字符序列。标识符由字母、数字、下划线和美元符号组成,但是第一个字符必须是字母、下划线或美元符号。标识符不能包含空格或其他特殊字符,也不能与Java关键字相同。标识符的长度没有限制,但是建议使用有意......
  • Java开发手册中为什么要求SimpleDateFormat时用y表示年,而不能用Y
    场景SimpleDateFormat是Java提供的一个格式化和解析日期的工具类。它允许进行格式化(日期->文本)、解析(文本->日期)和规范化。SimpleDateFormat使得可以选择任何用户定义的日期-时间格式的模式。在Java中,可以使用SimpleDateFormat的format方法,将一个Date类型转化为Stri......
  • java并发
    基础1.并行跟并发有什么区别?从操作系统的角度来看,线程是CPU分配的最小单位。并行就是同一时刻,两个线程都在执行。这就要求有两个CPU去分别执行两个线程。并发就是同一时刻,只有一个执行,但是一个时间段内,两个线程都执行了。并发的实现依赖于CPU切换线程,因为切换的时间特别短,所......
  • java的线程状态
     New新创建创建一个Thread对象,但还未调用start()启动线程时,线程处于初始态。Runnable可运行在Java中,可运行态包括:Ready和RunningReady就绪态该状态下的线程已经获得执行所需的所有资源,CPU只要分配执行权就能运行。所有就绪态的线程存放在就绪队列中。Running运行中已获得CP......
  • java线上问题定位
    获取pidps-ef|grepjava pid下的线程资源占用情况top-Hppid将资源占用高这几个pid转为16进制下载当前的java线程栈查询16进制pid线程情况 java线程栈 jstack-lpid>/1.txt 导出堆快照jmap-dump:live,format=b,file=./heap.hprofpid 查看资源占用最大前30......
  • 1.2 Java基础 数据类型(Integer源码解析)
    Java数据类型和Integer源码解析1.2.1基本数据类型1.2.2什么是拆装箱1.2.3拆装箱是如何实现的1.2.4Integer继承关系1.2.5Integer源码解析1.2.1基本数据类型       如大家所知,Java是一门面向对象的语言,但是java并非完全面向对象,Java中的数据类型分为了       ......
  • 基础必会必考点 Java数组
    Java数组连续存储的元素集合<fontface="楷体">个人认为Java中的数据即C++、C语言相同,一定是连续分配的。笔者在C语言教材找到这样一段话可以证明:Allelementsofaone-dimensionalarrayarealwaysstoredinconsecutivememorylocations.数组定义非初始化:int[]a1;初始化:......
  • 4.3 Java Pipe管道详解
    4.3Pipe       Java管道Pipe是用于线程间通信的,但是需要注意的是,Java中的Pipe是用于一个虚拟机中的线程之间通信的,不能用于进程之间通信。Java管道和Unix/Linux中的管道Pipe的作用是不同的,Unix/Linux中的管道是用于进程之间通讯,是不同Process之间。而Java是同一个虚拟机......