Java浮点数精确运算陷阱
System.out.println(2.0 - 1.1);
以上结果为0.899999999999999...;
如果需要精确运算,需要使用BigDecimal类进行运算。
BigDecimal a1 = new BigDecimal(Double.toString(2.0));
BigDecimal a2 = new BigDecimal(Double.toString(1.1));
System.out.println(a1.subtract(a2).doublevalue());
Java自增自减陷阱
for(int i = 0; i < 100; i++)
{
j = j++;
}
System.out.println(j);
结果为j = 0;
这是因为在JVM工作原理中,先执行j++后,再将j++之前的值赋给j,也就是j自加1后,再将0赋值给j,因此在这个代码中执行的结果是j=0。
Java字符和字符串陷阱
System.out.println("a" + "b");
System.out.println('a' + 'b');
System.out.println("a" + 'b');
结果为:
ab
195
ab
原因很简单,字符间的操作是将ASNII码进行操作的。
第三行将字符‘b’强制转换为“b”,然后将字符串拼接。
Java return 与try-finally陷阱
try
{
return false;
}
finally
{
return true;
}
结果为:true
这个很简单,在try的return前将会执行finally,finally有return,将会优先return。
try
{
System.out.println("Hello!");
System.exit(0);
}
finally
{
System.out.println("GoodBye!");
}
结果为:Hello!
结果很显而易见,因为遇到System.exit(0),finally将不会再执行