Java中的陷阱题
来源:互联网 发布:mysql select嵌套 编辑:程序博客网 时间:2024/06/16 07:48
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是不可达语句,在编译阶段将优化去掉。
0 0
- Java中的陷阱题
- Java 中的陷阱题
- Java面试中的陷阱
- Java面试中的陷阱
- Java面试中的陷阱
- Java面试中的陷阱
- Java面试中的陷阱
- Java 面试中的陷阱
- Java 面试中的陷阱
- Java 面试中的陷阱
- Java 面试中的陷阱
- Java 面试中的陷阱
- Java面试中的陷阱
- Java面试中的陷阱
- Java面试中的陷阱
- java 中的陷阱。
- Java中的陷阱
- Java中的陷阱
- jquery attr设置属性失效问题
- ActiveMQ技术分享
- linux的Ext2文件系统(序)
- mvc记住密码功能
- No enclosing instance of type xxx is accessible 问题及解答,静态方法调用动态方法问题
- Java中的陷阱题
- RMI流程简述
- 公共项查找---02_多个数组查找子项
- Docker attach正确的退出方式
- 自定义View之圆形TextView
- sqk小结
- MongoDB数据库设计中6条重要的经验法则2
- PCIe学习笔记(19)--- Power Management (4)--software init link pwr mng
- 公共项查找---03_两个数组查找子字符串