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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lvshen9 中级黑马   /  2017-2-26 08:44  /  964 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Java 中的陷阱题


1、找奇数:



public static boolean isOdd(int i){

         return i % 2 == 1;

    }



上面的方法真的能找到所有的奇数么?



A:没有考虑到负数问题,如果i为负则不正确。应该return i%2 == 0



2. 浮点数相减



System.out.println(2.0-1.9);



A:Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。当然加减乘除都有可能有问题,比如:



System.out.println(0.05+0.01);

System.out.println(1.0-0.42);

System.out.println(4.015*100);

System.out.println(123.3/100);



这是因为有些十进制有限位数的小数,到二进制里面可能会变成无限循环小数,在浮点数中不能表示而损伤精度。



解决方法:



1. 如果是判断a-b是否等于c,或者a+b是否等于c的,可以使用



if(0.05+0.01-0.06 < 0.0000001)

{

}



2. 在《Effective Java》这本书中提到一个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal来解决



System.out.println((new BigDecimal("2.0")).subtract(

                new BigDecimal("1.9")).doubleValue());



3. 无限循环



public static final int END = Integer.MAX_VALUE;

    public static final int START = END - 2;



    public static void main(String[] args) {

        int count = 0;

        for (int i = START; i <= END; i++)

            count++;

        System.out.println(count);

    }



A:这里无限循环的原因就是当i为Integer.MAX_VALUE时,此时for循环是先++,然后判断i是否<=END,当i为Integer.MAX_VALUE再++时,i变成了负数。所以就一直循环下去。



变成负数的原因就是int溢出了。这里将<=END改成<END就可以解决问题。



4. 到底返回什么?



public static boolean decision() {

     try {

        return true;

    } finally {

      return false;

    }

}



A:返回false。此时return true是不可达语句,在编译阶段将优化去掉。



     
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端

3 个回复

正序浏览
嗯,学习了
回复 使用道具 举报
第一个要返回奇数,要判断i % 2 == 0,false的话返回i
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
明显不行吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马