`

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还提供了一些特殊的操作符,如三元操作符(? :)和位操作符(&、|、^、~、、>>)。使用这些操作符时,需要注意它们的优先级和结合性

    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 语 言 的 热 潮 。 香 港 则 在 今 年 4月 就 举 行 了 全 岛 的 Java杯 比 赛 ,在 计 算 机界掀...

    编程思想下篇

    3.12 三元操作符 if-else 3.13 字符串操作符 + 和 += 3.14 使用操作符时常犯的错误 3.15 类型转换操作符 3.15.1 截尾和舍入 3.15.2提升 3.16 Java没有“sizeof” 3.17 操作符小结 3.18 总结 第4章 控制执行流程 4.1 ...

    java 编程入门思考

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    Java初学者入门教学

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    java联想(中文)

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    java初学者必看

    2.4 第一个应用程序 2.4.1 HelloWorld程序 2.4.2 程序运行编译命令 2.4.3 HelloWorld编译与运行 2.5 简单开发工具介绍 2.5.1 EditPlus的编译与运行 2.5.2 在UltraEdit上开发Java 2.6 集成开发环境Eclipse介绍 ...

    JAVA_Thinking in Java

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    Thinking in Java简体中文(全)

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    Thinking in Java 中文第四版+习题答案

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 总结...

    Thinking in java(中文)

    类 2.4.1 字段和方法 2.5 方法、自变量和返回值 2.5.1 自变量列表 2.6 构建Java程序 2.6.1 名字的可见性 2.6.2 使用其他组件 2.6.3 static关键字 2.7 我们的第一个Java程序 2.8 注释和...

    JAVA_Thinking in Java(中文版 由yyc,spirit整理).chm

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

    21天学通Java-由浅入深

    28 1.3 程序开发过程 29 1.4 编码规范 29 1.5 HelloWorld:第一个Java程序 30 1.5.1 编写程序代码 30 1.5.2 编译程序代码并运行 30 1.5.3 注意事项 31 1.6 使用Eclipse集成开发工具开发 32 1.7 综合练习 32 1.8 小结...

    java7hashmap源码-java:Java

    day08_高级类特性1:多态特性、4中访问权限修饰符、this与super区别、==与equals方法区别、instanceof操作符 day09_高级类特性1:toString(方法)、包装类、static关键字 day10_高级类特性2:初始化块、抽象类、...

    Think in Java(中文版)chm格式

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码...

    Thinking in Java(中文版 由yyc,spirit整理).chm

    2.7 我们的第一个Java程序 2.8 注释和嵌入文档 2.8.1 注释文档 2.8.2 具体语法 2.8.3 嵌入HTML 2.8.4 @see:引用其他类 2.8.5 类文档标记 2.8.6 变量文档标记 2.8.7 方法文档标记 2.8.8 文档示例 2.9 编码样式 2.10 ...

Global site tag (gtag.js) - Google Analytics