最近同事分享了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...