A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© txl 中级黑马   /  2013-1-21 00:16  /  2435 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马唐贤来 于 2013-1-22 10:32 编辑
  1. class Test
  2. {
  3. public static void main(String[] args)
  4. {
  5. //System.out.println(((Integer)null).intValue());

  6. Integer i = null;
  7. System.out.println((i==null)?1:(i+(i==null?1:2)));
  8. }
  9. }
复制代码
基础题,绝对难到很多人中说是因为最后的null+1出错的,可我发现最后是执行不到的,如上,有人能给我解释的更具体点吗

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

12 个回复

倒序浏览
其实是执行了的,只不过程序中选择了数字1这个结果,后面那个运算出来的结果你不要罢了
回复 使用道具 举报
你这个程序执行
  1. System.out.println((i==null)?1:(i+(i==null?1:2)));
复制代码
时就输出1,后面的(i+(i==null?1:2))没有执行,你是判断不出来i+null的
这样子可以判断一下:
Integer i=null;
System.out.println(4+i);
回复 使用道具 举报
本帖最后由 黑马唐贤来 于 2013-1-21 11:49 编辑
黑马刘杰 发表于 2013-1-21 11:31
你这个程序执行时就输出1,后面的(i+(i==null?1:2))没有执行,你是判断不出来i+null的
这样子可以判断一下 ...


这个我知道,我也觉得后面是执行不到的,可为什么下面的代码能执行到呢
  1. public static void main(String[] args)
  2.         {
  3.                 Map<String, Integer> map = new HashMap<String, Integer>();
  4.                 String str = "x";
  5.                 Integer i = Math.random()*10 > 7? 5 : null;
  6.                 System.out.println(i);
  7. map.get(str)==

  8.                 map.put(str, map.get(str)==null ? i : (map.get(str) + (i==null? 1 : i)));
  9.         }
复制代码
其中map.get(str)绝对是等于null的...
回复 使用道具 举报
本帖最后由 张向辉 于 2013-1-21 13:40 编辑

对于这个 我测试的结果是 为ture的情况  第二个表达式 没有执行
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                char ch ='a';
                int num = 0;
                boolean bool = true;
                System.out.println(bool?ch:0);
                System.out.println(!bool?num:ch);
                Integer i =null;
                //bool?System.out.println("aaa"):System.out.println("cccc");
                //System.out.println(bool ? i : b()+1);
                System.out.println(bool ? a(): b()+1);

        }
        public static Integer a()
        {
                System.out.println("aaaa");
                return null;
                //return 1;
        }
        public static Integer b()
        {
                System.out.println("bbbb");
                return 1;
                //return null;
        }
a为1,b为null  程序不会有问题。

评分

参与人数 1黑马币 +15 收起 理由
txl + 15 赞一个!

查看全部评分

回复 使用道具 举报
出现空指针异常 不是第二个表达式的问题  是第一个的问题  
回复 使用道具 举报
黑马唐贤来 发表于 2013-1-21 11:48
这个我知道,我也觉得后面是执行不到的,可为什么下面的代码能执行到呢其中map.get(str)绝对是等于null的.. ...

这样子判断一下
  1. Integer i =  null;
  2. System.out.println(i==null?i:1);
复制代码
它也是报异常,问题就应该出现在 i==null?i 这里
回复 使用道具 举报
苏克 中级黑马 2013-1-21 15:09:28
8#
这个不是后面代码有没有执行的问题,而是三元运算符本身的问题。下面以楼主代码为例说明。
Map<String, Integer> map = new HashMap<String, Integer>();
        String str = "x";
        Integer i = Math.random()*10 > 7? 5 : null;
        System.out.println(i);
        map.put(str, map.get(str)==null ? i : (map.get(str) + (i==null? 1 : i)));

这个代码当i=null;就会空指针报异常,i=5时就不会。当代码变成这句话的时候也不会出异常  map.put(str, map.get(str)==null ? null : (map.get(str) + (i==null? 1 : i)));
从这就可以看出,三元运算符可以接收null值作为判断的结果,但是当接收的不是null,而是对象的时候,这个对象是null的时候就会抛出异常。
举个例子说明:就好比,两个小孩猜硬币。第一次A小孩对B小孩说,咱们猜硬币吧,不过猜对了什么都没有啊,B小孩一想,没有就没有吧,就当玩游戏。这时候两个小孩相互没事。
                             但是第二天A小孩又对B小孩说,咱们才硬币吧,猜对了我给你个礼物(此时的A并没有礼物),B小孩高兴啊,猜对了还有礼物,多好啊。结果B猜对了,向A要礼物,这是A说了没有礼物。于是两个小孩打起来了(空指针异常)。另一种结果就是B猜错了,那么不管A有没有礼物都没关系,因为B猜错了,A有没有礼物都跟B没关系了。
例子不是很恰当,但是可以帮助理解。

点评

赞一个 null是一个常量,所以不会有空指针异常  发表于 2013-1-21 15:34

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
高浩 中级黑马 2013-1-21 22:56:43
9#
三元运算符:(判断条件)?true:false

jdk1.5版本以后有了自动装箱和拆箱的功能,
i虽是Integer类型但可以和基本数据类型相计算的
但如果出现了它会报空指针异常
回复 使用道具 举报
我的分析已经放出来了,指教指教{:soso_e113:}


HashMap<String, Integer>
map.put(str, map.get(str)==null ? i : (map.get(str) + (i==null? 1 : i)));

在编译时期就要确定表达式的类型
i==null? 1 : i,表达式2和3分别是int和Integer,该语句的返回类型是int,可以推出表达式3也就是 (map.get(str) + (i==null? 1 : i))的返回类型为int
可以看作:
map.get(str)==null ? Integer : int,所以当i=5的时候,i可以正常拆箱,但当i=null,拆箱的时候调用null.intValue(),就会报空指针异常

验证:
map.put(str, map.get(str)==null ? 1 : (map.get(str) + (i==null? 1 : i)));
把i改成常量,保证表达式2类型为int,这时无论i等于什么,程序都正常,可以说明问题就出在表达式2的拆箱


所以在使用三元运算符,如果:两边表达式的类型不一致,最好做显式强制类型
map.put(str, map.get(str)==null ? i : (Integer)(map.get(str) + (i==null? 1 : i)));
回复 使用道具 举报
希望对还有所帮助
      static void Main(string[] args)
        {
            bool flag = (4 > 5) ? (5 > 6) : (6 > 5);
            bool flag2 = (4 > 5) ? (5 < 6) : (6 < 5);
            Console.WriteLine(flag);
            Console.WriteLine(flag2);
            Console.ReadKey();
        }
显示结果 true fase
回复 使用道具 举报
txl 中级黑马 2013-7-10 22:29:12
12#
hjz564 发表于 2013-6-22 15:51
希望对还有所帮助
      static void Main(string[] args)
        {

呵呵,老坟都被你挖出来啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马