`

JAVA三元操作符的一个坑

 
阅读更多

 

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

 

 

 

 

0
0
分享到:
评论

相关推荐

    java 三元操作符的使用

    在Java中,三元操作符是一种简洁的条件表达式,用于在两个值之间进行选择。

    Java基础知识之数据类型和操作符

    Java是一种强类型语言,这意味着在Java中,每个变量都必须先声明其数据...此外,Java还提供了一些特殊的操作符,如三元操作符(? :)和位操作符(&、|、^、~、、>>)。使用这些操作符时,需要注意它们的优先级和结合性

    Java操作符总结-动力节点共20页.pdf.zip

    类型转换操作符允许我们将一个类型的值转换为另一个类型。这通常涉及强制类型转换,如"(int)",以及自动类型转换,当赋值兼容时,系统会自动进行。 九、空操作符(null) 空操作符null用于表示对象的引用为空,表示...

    Java操作符的优先级和结合性

    以下是一个完整的Java操作符优先级列表: 1. 后缀运算符:`[ ]`、`.`、`( )`(函数调用) —— 这些操作符从左到右执行。例如,`array[index]`、`object.method()` 和 `(expression)`。 2. 单目运算符:`!`、`~`、...

    操作符学习案例

    2. **赋值操作符**:用于将一个值赋给变量,例如`=`, `+=`, `-=`等。例如: ```java a = b; // 将b的值赋给a a += b; // 等同于 a = a + b ``` 3. **比较操作符**:用于比较两个值,如`==`(等于)、`!=`(不等于)...

    EL常用操作符

    - **三元操作符**(`?:`):类似于Java中的三元条件操作符,其格式为`表达式 ? 真值 : 假值`。例如,`score > 60 ? '合格' : '不合格'`。 - **算术操作符**:包括加法(`+`)、减法(`-`)、乘法(`*`)、除法(`/`...

    详解Java的按位操作符

    Java的三元操作符是一种特殊的操作符,功能和if-else类似。它可以根据条件表达式的值来选择执行不同的语句。 Java的按位操作符是Java语言中一个非常重要的概念,它们可以实现复杂的逻辑操作和数据处理。通过学习和...

    Thinking in java4(中文高清版)-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的位操作符和三元操作符可以提高代码的效率和可读性,尤其是在处理底层数据结构和算法时。在编写高性能的Java程序时,这些工具是不可或缺的。

    JAVA工程师笔试题汇总(免费)

    静态变量在类加载时初始化,只有一份拷贝,所有实例共享同一个静态变量。在main方法中,x先自减1,然后调用myMethod方法,最后打印x+y+ ++x的结果。由于x和y都是静态变量,因此它们的值会被保留和累加。 知识点3:...

    《Java编程思想》学习笔记1(操作符、控制语句、对象、初始化与清理).doc

    **1.9 三元条件操作符** - **格式**: `boolean-exp ? value0 : value1` - **功能**: 根据 `boolean-exp` 的真假选择 `value0` 或 `value1`。 #### 二、控制语句 **2.1 for-each 循环** - **语法**: `for...

    java培训笔记.doc

    1. 三元操作符 `?:`:这是Java中的条件操作符,语法为 `条件 ? 表达式1 : 表达式2`。如果条件为真,它会执行表达式1,否则执行表达式2。在示例中,`c = a > b ? 4 : 5;` 如果 `a` 大于 `b`,则 `c` 被赋值为4,否则...

    Java 修饰符和运算符

    Java 语言中的修饰符和运算符是编程的基础元素,它们在构建程序时起着至关重要的作用。理解并熟练掌握这些概念对于编写高效、可维护的代码至关重要。 首先,我们来看 Java 的访问控制修饰符。Java 提供了四种不同的...

    java笔记学习之操作符

    在Java编程语言中,操作符是用于执行特定操作的关键字或符号,它们在代码中起到至关重要的作用。本文将深入探讨Java中的各种操作符,包括算术、自增自减、关系、逻辑、直接和类型转换等。 首先,我们来看算术运算符...

    java 基本数据类型及基本操作.ppt

    表达式是组合操作符、变量和常量的结构,可以计算出一个值。 2.3 数值数据类型及其运算 Java有四种整型(byte、short、int、long)和两种浮点型(float、double),分别用于表示不同范围的整数和小数。它们支持算术...

    Java初学者用的基本Java简答题

    关于表达式++x和x++,它们都是操作符,前者是前缀递增,先增加后使用;后者是后缀递增,先使用后增加。 Java中的运算符可分为六类:算术运算符(如+、-、*、/、%),关系运算符(如==、!=、>、<、>=、),逻辑...

    java基础视频-用于初学者

    表达式则是由变量、常量、操作符以及括号组合而成的代码片段,它们用于计算并返回一个值。例如,`int result = 5 + 3;` 这个语句中的 `5 + 3` 就是一个表达式,它计算出8,并将结果赋值给变量`result`。 在Java中,...

    Java基础知识.docx

    7. **特殊操作符**:如三元操作符? :,类访问.,对象创建new等。 8. **类型转换**:包括自动类型转换和强制类型转换。 ### 第四章 控制语句 1. **分支语句**:if、if-else、switch。 2. **循环语句**:for、while...

Global site tag (gtag.js) - Google Analytics