最近同事分享了coding过程中的一个坑,自己就写了个demo尝试了下,觉得很有意思,拿出来分享下。
场景:
下面的代码一执行会出现NPE的异常,但是仔细看了下代码怎么也不应该出现NPE异常。
public class A { public static void main(String[] args) { Long test = null; Long a = 2 > 1 ? test : 0L; } }
分析:
无奈,唯有拿个字节码工具出来下,看看Java底层是怎么走的。细分析下才恍然大悟,但是为啥要做一次拆箱和装箱呢,这个估计只能问语言的设计者了。
0:null 压入栈顶
1: null 压出赋值给第一个变量
2:第一个变量压入栈顶
3:执行实例的.longValue方法
6:执行静态方法 Long.longValue转化成Long
9. 压出栈顶元素赋值给的第二个变量
10:结束
// javap -verbose A public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=3, args_size=1 0: aconst_null 1: astore_1 2: aload_1 3: invokevirtual#2 //Method java/lang/Long.longValue:()J 6: invokestatic #3 //Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 9: astore_2 10: return LineNumberTable: line 4: 0 line 5: 2 line 6: 10
相关推荐
在Java中,三元操作符是一种简洁的条件表达式,用于在两个值之间进行选择。
Java是一种强类型语言,这意味着在Java中,每个变量都必须先声明其数据...此外,Java还提供了一些特殊的操作符,如三元操作符(? :)和位操作符(&、|、^、~、、>>)。使用这些操作符时,需要注意它们的优先级和结合性
类型转换操作符允许我们将一个类型的值转换为另一个类型。这通常涉及强制类型转换,如"(int)",以及自动类型转换,当赋值兼容时,系统会自动进行。 九、空操作符(null) 空操作符null用于表示对象的引用为空,表示...
以下是一个完整的Java操作符优先级列表: 1. 后缀运算符:`[ ]`、`.`、`( )`(函数调用) —— 这些操作符从左到右执行。例如,`array[index]`、`object.method()` 和 `(expression)`。 2. 单目运算符:`!`、`~`、...
2. **赋值操作符**:用于将一个值赋给变量,例如`=`, `+=`, `-=`等。例如: ```java a = b; // 将b的值赋给a a += b; // 等同于 a = a + b ``` 3. **比较操作符**:用于比较两个值,如`==`(等于)、`!=`(不等于)...
- **三元操作符**(`?:`):类似于Java中的三元条件操作符,其格式为`表达式 ? 真值 : 假值`。例如,`score > 60 ? '合格' : '不合格'`。 - **算术操作符**:包括加法(`+`)、减法(`-`)、乘法(`*`)、除法(`/`...
Java的三元操作符是一种特殊的操作符,功能和if-else类似。它可以根据条件表达式的值来选择执行不同的语句。 Java的按位操作符是Java语言中一个非常重要的概念,它们可以实现复杂的逻辑操作和数据处理。通过学习和...
3.5.1 一元加、减操作符 3.6 自动递增和递减 3.7 关系操作符 3.7.1 测试对象的等价性 3.8 逻辑操作符 3.8.1 短路 3.9 直接常量 3.9.1 指数记数法 3.10 按位操作符 3.11 移位操作符 3.12 三元操作符 if-else 3.13 ...
Java的位操作符是编程语言中用于直接操纵...总的来说,理解并熟练运用Java的位操作符和三元操作符可以提高代码的效率和可读性,尤其是在处理底层数据结构和算法时。在编写高性能的Java程序时,这些工具是不可或缺的。
静态变量在类加载时初始化,只有一份拷贝,所有实例共享同一个静态变量。在main方法中,x先自减1,然后调用myMethod方法,最后打印x+y+ ++x的结果。由于x和y都是静态变量,因此它们的值会被保留和累加。 知识点3:...
**1.9 三元条件操作符** - **格式**: `boolean-exp ? value0 : value1` - **功能**: 根据 `boolean-exp` 的真假选择 `value0` 或 `value1`。 #### 二、控制语句 **2.1 for-each 循环** - **语法**: `for...
1. 三元操作符 `?:`:这是Java中的条件操作符,语法为 `条件 ? 表达式1 : 表达式2`。如果条件为真,它会执行表达式1,否则执行表达式2。在示例中,`c = a > b ? 4 : 5;` 如果 `a` 大于 `b`,则 `c` 被赋值为4,否则...
Java 语言中的修饰符和运算符是编程的基础元素,它们在构建程序时起着至关重要的作用。理解并熟练掌握这些概念对于编写高效、可维护的代码至关重要。 首先,我们来看 Java 的访问控制修饰符。Java 提供了四种不同的...
在Java编程语言中,操作符是用于执行特定操作的关键字或符号,它们在代码中起到至关重要的作用。本文将深入探讨Java中的各种操作符,包括算术、自增自减、关系、逻辑、直接和类型转换等。 首先,我们来看算术运算符...
表达式是组合操作符、变量和常量的结构,可以计算出一个值。 2.3 数值数据类型及其运算 Java有四种整型(byte、short、int、long)和两种浮点型(float、double),分别用于表示不同范围的整数和小数。它们支持算术...
关于表达式++x和x++,它们都是操作符,前者是前缀递增,先增加后使用;后者是后缀递增,先使用后增加。 Java中的运算符可分为六类:算术运算符(如+、-、*、/、%),关系运算符(如==、!=、>、<、>=、),逻辑...
表达式则是由变量、常量、操作符以及括号组合而成的代码片段,它们用于计算并返回一个值。例如,`int result = 5 + 3;` 这个语句中的 `5 + 3` 就是一个表达式,它计算出8,并将结果赋值给变量`result`。 在Java中,...
7. **特殊操作符**:如三元操作符? :,类访问.,对象创建new等。 8. **类型转换**:包括自动类型转换和强制类型转换。 ### 第四章 控制语句 1. **分支语句**:if、if-else、switch。 2. **循环语句**:for、while...