专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
Java编程精选  ·  前美团员工自曝:35岁被裁后gap一年多,身 ... ·  5 天前  
芋道源码  ·  实用指南:解决 SpringBoot ... ·  3 天前  
芋道源码  ·  秒懂双亲委派机制 ·  4 天前  
芋道源码  ·  京东一面:MySQL 中的 ... ·  5 天前  
51好读  ›  专栏  ›  ImportNew

Java 中的陷阱题

ImportNew  · 公众号  · Java  · 2017-03-31 12:03

正文

(点击上方公众号,可快速关注)


来源:Hosee,

my.oschina.net/hosee/blog/616705

如有好文章投稿,请点击 → 这里了解详情


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改成


4. 到底返回什么?


public static boolean decision() { 

     try { 

        return true; 

    } finally { 

      return false; 

    } 

}


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


如果还有其他欢迎补充。


Reference:


1. http://blog.csdn.net/ol_beta/article/details/5598867


2. http://zhidao.baidu.com/link?url=0UyDU42L7DXZitdydJMG3IIUDIf3xidFCRAObZAq6SHFCEaNnp2Oyuq1KVwBvmlR0UZGHSjD4f6A1yD0d65JL_


3. http://bbs.csdn.net/topics/300023952


4. http://z466459262.iteye.com/blog/739300


看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能