打字猴:1.700440182e+09
1700440182 编写高质量代码:改善Java程序的151个建议 [:1700438091]
1700440183 编写高质量代码:改善Java程序的151个建议 建议23:不要让类型默默转换
1700440184
1700440185 我们出一个小学生的题目给大家做做看,光速是每秒30万公里,根据光线旅行的时间,计算月亮与地球、太阳与地球之间的距离。代码如下:
1700440186
1700440187 public class Client{
1700440188
1700440189 //光速是30万公里/秒,常量
1700440190
1700440191 public static final int LIGHT_SPEED=30*10000*1000;
1700440192
1700440193 public static void main(String[]args){
1700440194
1700440195 System.out.println(“题目1:月亮光照射到地球需要1秒,计算月亮和地球的距离。”);
1700440196
1700440197 long dis1=LIGHT_SPEED*1;
1700440198
1700440199 System.out.println(“月亮与地球的距离是:”+dis1+“米”);
1700440200
1700440201 System.out.println(”––––––––––––––—”);
1700440202
1700440203 System.out.println(“题目2:太阳光照射到地球上需要8分钟,计算太阳到地球的距离。”);
1700440204
1700440205 //可能要超出整数范围,使用long型
1700440206
1700440207 long dis2=LIGHT_SPEED*60*8;
1700440208
1700440209 System.out.println(“太阳与地球的距离是:”+dis2+“米”);
1700440210
1700440211 }
1700440212
1700440213 }
1700440214
1700440215 估计你要鄙视了,这种小学生乘法计算有什么可做的。不错,确实就是一个乘法运算,我们运行一下看看结果:
1700440216
1700440217 题目1:月亮光照射到地球需要1秒,计算月亮和地球的距离。
1700440218
1700440219 月亮与地球的距离是:300000000米
1700440220
1700440221 ––––––––––––––—
1700440222
1700440223 题目2:太阳光照射到地球上需要8分钟,计算太阳到地球的距离。
1700440224
1700440225 太阳与地球的距离是:-2028888064米
1700440226
1700440227 太阳和地球的距离竟然是负的,诡异。dis2不是已经考虑到int类型可能越界的问题,并使用了long型吗,为什么还会出现负值呢?
1700440228
1700440229 那是因为Java是先运算然后再进行类型转换的,具体地说就是因为disc2的三个运算参数都是int类型,三者相乘的结果虽然也是int类型,但是已经超过了int的最大值,所以其值就是负值了(为什么是负值?因为过界了就会从头开始),再转换成long型,结果还是负值。
1700440230
1700440231 问题知道了,解决起来也很简单,只要加个小小的“L”即可,代码如下:
[ 上一页 ]  [ :1.700440182e+09 ]  [ 下一页 ]