(1)下面是一个试图解决上述问题的程序,它会打印出什么呢?
public class Change{
public static void main(String args[]){
System.out.println(2.00 - 1.10);
}
}

答案:0.8999999999999999

原因:

在于1.1 这个数字不能被精确表示成为一个double,因此它被表示成为最
接近它的double 值。更一般地说,问题在于并不是所有的小数都可以用二进制浮点数来精确表示的

解决方法:解决该问题的另一种方式是使用执行精确小数运算的BigDecimal。它还可以通

过JDBC 与SQL DECIMAL 类型进行互操作。这里要告诫你一点: 一定要用
BigDecimal(String)构造器,而千万不要用BigDecimal(double)。后一个构造
器将用它的参数的“精确”值来创建一个实例:new BigDecimal(.1)将返回一个
表示0.100000000000000055511151231257827021181583404541015625 的
BigDecimal。

通过正确使用BigDecimal:

import java.math.BigDecimal;
public class Change1{
public static void main(String args[]){
System.out.println(new BigDecimal("2.00").
subtract(new BigDecimal("1.10")));
}
}

总之, 在需要精确答案的地方,要避免使用float 和double;对于货币计算,
要使用int、long 或BigDecimal

(2)长整除

public static void main(String args[]){

        final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
}

看起来程序打印的必定是1000。
遗憾的是,它打印的是5

原因:

尽管计算的结果适合放
入long 中,并且其空间还有富余,但是这个结果并不适合放入int 中。这个计
算完全是以int 运算来执行的,并且只有在运算完成之后,其结果才被提升到
long,而此时已经太迟了:计算已经溢出了

下面的程序将打印出我们所期望的
1000:

public class LongDivision{
public static void main(String args[ ]){
final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;
final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000;
System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
}

结论:此场景在项目中用到的很多,请注意

(3)x = x + i;与x += i;

short x = 0;
int i = 123456;
x += i; // 包含了一个隐藏的转型!
x = x + i; // 不要编译——“可能会丢掉精度”

  

public static void main(String args[]){

Object x = "Buy ";
String i = "Effective Java!";
x = x + i; //ok,因为 x + i 是String 类型的,而String 类型又是与Object赋值兼容的
x += i; //编译不通过,因为左侧是一个Object 引用类型,而右侧是一个String类型:
}
结论:

要想用 += 操作符来执行字符串连接操作,
你就必须将左侧的变量声明为String 类型。

如果在+=操作符左侧的操作数是String
类型的,那么它允许右侧的操作数是任意类型,在这种情况下,该操作符执行的
是字符串连接操作。简单赋值操作符(=)允许其左侧的是对象引用类型,这就
显得要宽松许多了:你可以使用它们来表示任何你想要表示的内容,只要表达式
的右侧与左侧的变量是赋值兼容的即可。


(4)字符

        System.out.println('H'+'a');  //输出169

        StringBuffer sb = new StringBuffer();
sb.append('H');
sb.append('a');
System.out.println(sb); //输出Ha

(5)

public static void main(String[] args) {
System.out.println(decision());
}
static boolean decision() {
try {
return true;
} finally {
return false;
}
}

它所打印的是
false。

分析:

。一条语句或一个语句块在它抛出了一个异常,或者对某个封闭型
语句执行了一个break 或continue,或是象这个程序一样在方法中执行了一个
return 时,将发生意外结束。它们之所以被称为意外结束

当try 语句块和finally 语句块都意外结束时,在try 语句块中引发意外结束的
原因将被丢弃,而整个try-finally 语句意外结束的原因将于finally 语句块意
外结束的原因相同。在这个程序中,在try 语句块中的return 语句所引发的意
外结束将被丢弃,而try-finally语句意外结束是由finally语句块中的return
造成的。简单地讲,程序尝试着(try)返回(return)true,但是它最终(finally)
返回(return)的是false。

 

(5)您好,再见!

public class HelloGoodbye {
public static void main(String[] args) {
try {
System.out.println("Hello world");
System.exit(0);
} finally {
System.out.println("Goodbye world");
}
}
}
它只打印了Hello world

分析:不论try语句块的执行是正常地还是意外地结束,finally语句块确实都会执行。
然而在这个程序中,try 语句块根本就没有结束其执行过程。System.exit 方法
将停止当前线程和所有其他当场死亡的线程。finally 子句的出现并不能给予线
程继续去执行的特殊权限。

总之,System.exit 将立即停止所有的程序线程,它并不会使finally 语句块得
到调用

 

java解惑--摘要的更多相关文章

  1. Java解惑五:类之谜

    本文是依据JAVA解惑这本书,做的笔记.电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题46 函数重载的问题. JAVA重载解析过程 ...

  2. 【Java解惑】表达式问题

    1. 如果判断一个参数是否是奇数? 我们通过下面代码来尝试一下,看看方法可行不: public static boolean isOdd(int i) { return i % 2 == 1; } p ...

  3. Java解惑八:很多其它库之谜

    本文是依据JAVA解惑这本书,做的笔记. 电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题76 将线程的启动方法start(),写成 ...

  4. java解惑之常常忘记的事

    java解惑之常常忘记的事 2012-10-17 18:38:57|  分类: JAVA |  标签:基础知识  软件开发  |举报|字号 订阅     针对刚接触java的菜鸟来说,java基础知识 ...

  5. Java 消息摘要 散列 MD5 SHA

    package xxx.common.util; import java.math.BigInteger; import java.security.MessageDigest; import jav ...

  6. [Java解惑]应用

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. [Java解惑]类

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. [Java解惑]异常

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. [Java解惑]字符串

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. HDU5730

    cdq分治+FFT 转移:dp[i]=Σdp[i-j]*a[j](1<=j<=i)

  2. 通过工具SecureCRTPortable将项目部署到服务器上

    1.将项目打包 2.打开工具连接指定的ip 下面是一些命令 tab键可以有一些提示功能 ls 查看服务器当前目录 lls 查看硬盘当前目录 其实就是linux系统命令 ,服务器是正常命令  ,操作本电 ...

  3. Arbitrage HDU1217

    汇率转换问题: 怎么样才能套利 可以用Floyd算法: #include<bits/stdc++.h> using namespace std; ][]; int main() { int ...

  4. 数据摘要 MD5

    数据一样,摘要一样  (摘要即MD5) 摘要一样,数据一样 摘要是用于检验数据的完整性的技术(比如验证下载的东西是否完整,迅雷就是这样), 查看文件的MD5: Linux         :  md5 ...

  5. Unity 之 rawimage 与image 的区别

    http://www.newbieol.com/information/740.html

  6. List实体去重

    public static ArrayList<Room> removeDuplicate(List<Room> room) { Set<Room> set = n ...

  7. WebPack 学习:从阮神的15个DEMO开始

    WebPack 是什么 官方就一句话,打包所有的资源. 从阮神的 15 DEOM入手 Webpack Github 地址 阮神GIT 按照 ReadME 操作 npm webpack-dev-serv ...

  8. IntelliJ IDEA关于logger的live template配置

    1.安装 log support2插件 2.配置log support2 由于项目中的日志框架是公司自己封装的,所以还需要自己手动改一下 log support2插件生成的live template ...

  9. @Resource 注解的使用

      1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况 ...

  10. 网页图表Highcharts实践教程之认识Highcharts

    网页图表Highcharts实践教程之认识Highcharts 认识Highcharts Highcharts是国际知名的一款图表插件.它完全使用Javascript编写实现.其结构清晰,使用简单.开 ...