黑马程序员——JAVA中易出现的小问题

第一:奇数性
static boolean isodd(int i){
       return i % 2 == 1;
      }
}
奇数可定义为被2整除,余数为1的整数。表达式i%2计算的是i除以2时所产生的余数,因此看起啦这个这个程序改可行,但是它并不行,在四分之一的时间里它产生的都是错误的。因为在所有的int数值中,有一半是负数,而isodd方法对所有负数的判断都会失败。在任何负数上调用该方法都会返回false,无论该整数是偶数还是奇数。
第二:浮点数
public class Xiao {
 public static void main(String[] args) {
  System.out.print(2.00-1.10); 
 }

}
该程序打印的是0.89999999999999 而不是0.9;问题在于1.1这个数字不能被精确表示为一个double,因此被表示为最接近它的double值,该程序从2中减去的就是这个值。所以,这个计算结果并不是最接近0.9的double值。作为结果的double值的最短表示就是你所看到的值。
第三:长整数
public class longDivision {
 public static void main(String[] args) {
  final long A=24*60*60*1000*1000;
  final long B=24*60*60*60*1000;
  System.out.print(A/B);
 }

}
看似程序该打印的是1000,其实打印的是5. 问题在于常数的计算确实溢出啦,虽然计算的结果合适放入long中,并且其空间还有富余,但是这个结果并不适合放入int中。这个计算完全是以int运算执行的,并且只有在运算完成之后,其结果才提升为long。而此时已经太迟,返回溢出啦。

改:
public class longDivision {
 public static void main(String[] args) {
  final long A=24L*60*60*1000*1000;
  final long B=24L*60*60*60*1000;
  System.out.print(A/B);
   }

}
这样改就对啦。
第四:大小写错误
public class elementary {
 public static void main(String[] args) {
  System.out.print(12345+5432l);
 }

}
本次错误的原因是把5432l看错啦“l”是字母“L”的小写;切记在long类型字面常量中,一定要用大写的“L”;
第五:进制数
public class Joyofhex{
 public static void main(String[] args) {
  System.out.print(Long.toHexString(0x1000000000L+0xcafebabe));
 }

}
十进制字面常量具有一个很好的属性,即所有十进制字面常量都是正的,额十六进制或是八进制字面常量并具备这个属性,想写一个负的十进制常量,可以使用一元取反操作符(-)连接一个十进制字面常量。以这种方式,你可以用十进制写任何int或long型数值,不管它是正的还是负的,并且负的十进制常数可以很明确的用一个减号来标识。但是十六进制和八进制字面常量并不是这样。他们可以具有正的以及负的数值。如果十六进制和八进制常量的最高位被置位了,那么他们就是负数。在这个过程中,数字0xcafebaba是int常量,它的最高位被置位了,那么它是一个负数,它的十进制值-889275714;

改:
public class Joyofhex{
 public static void main(String[] args) {
  System.out.print(Long.toHexString(0x1000000000L+0xcafebabeL));
 }

}
在0xcafebabe后加上L表示长整形数相加;
第六:多重转型
public class Multicast {
 public static void main(String[] args) {
  System.out.print((int)(char)(byte)-1);

}
因为byte是有符号的类型,所以在将byte数值-1转换成char时,会发生符号扩展。作为结果char数值的16位就都被置位了,因此它等于2^16-1.即65535.
如果最初的数值类型是有括号的,就执行符号扩展;如果它是char,那么不管它将要被转换成什么类型,都执行零扩展。
第七:变量赋值
public class DosEquis{
 public static void main(String[] args) {
  int x=1984;
  int y=2001;
  x^=y^=x^=y;
  System.out.print("x="+x+"; y="+y);

      }
}
它执行的结果是x=0;y=1984;
在单表达式中不要对相同的变量赋值两次。表达式如果包含对相同变量的多次赋值,就会引起混乱,并且很少能够执行所希望的操作。即使对多个变量进行赋值也很容易出错。
第八:操作数转型
public class Xiao{
 public static void main(String[] args) {
  char x='X';
  int i=0;
  System.out.println(true?x:0);
  System.out.println(false?i:x);

}
}
运行程序结果是:X   88
这是由于在表达式中使用不同的类型操作数;在这两个表达式中第一个表达式X是char类型的,而0和i都是int类型的;
第九:字符错误
public class Xiao{
 public static void main(String[] args) {
  System.out.println("H"+"a");
  System.out.println('H'+'a');

       }
}
执行的结果是:Ha 169
编译器在计算表达式'H''a'时,是通过我们熟知的拓宽基本类型转换,将两个具有字符类型数值的操作数,提升为int数值而实现的,从char到int的拓宽基本类型转化是将16位的char数值零宽展到32位的int。对于‘H’char数值是72,而对于‘a’,char数值97,因此表达式‘H’+‘a’等价于int72+97,或169;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值