当前位置: 首页 > news >正文

Java中的陷阱题

为什么80%的码农都做不了架构师?>>>   hot3.png

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是不可达语句,在编译阶段将优化去掉。


如果还有其他欢迎补充。


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

转载于:https://my.oschina.net/hosee/blog/616705

相关文章:

  • Host文件?
  • js阻止表单重复提交
  • 为什么要域名解析?
  • Providers、Controller 、Service、DirectiveFactory
  • DNS查找详细过程
  • 将一个数进行拆分,并且正序输出
  • 谈谈你对域名缓存的了解?
  • 进程间通信方式
  • 什么是递归查询,迭代查询?
  • Java中的4种代码块
  • 什么是沾包?如何处理?
  • 继续測试,一如既往的稳定
  • 【< TCP专题之三次握手四次挥手>】
  • SQL 设置空值(NULL)
  • 【<TCP专题>】
  • download使用浅析
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript 一些 DOM 的知识点
  • Java到底能干嘛?
  • Js基础知识(一) - 变量
  • Python十分钟制作属于你自己的个性logo
  • SpiderData 2019年2月25日 DApp数据排行榜
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 阿里云前端周刊 - 第 26 期
  • 初探 Vue 生命周期和钩子函数
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 聚类分析——Kmeans
  • 老板让我十分钟上手nx-admin
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 在weex里面使用chart图表
  • ​虚拟化系列介绍(十)
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • ${ }的特别功能
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (剑指Offer)面试题34:丑数
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (原)Matlab的svmtrain和svmclassify
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net framework4与其client profile版本的区别
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 中创建支持集合初始化器的类型
  • .pop ----remove 删除
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [1] 平面(Plane)图形的生成算法
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [4.9福建四校联考]
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)
  • [C# WPF] 如何给控件添加边框(Border)?
  • [cb]UIGrid+UIStretch的自适应
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)
  • [CLickhouse] 学习小计