下面的程序循环遍历byte数值,以查找某个特定值。这个程序会打印出什么呢? public class BigDelight { public static void main(String[] args) { for (byte b = Byte.MIN_VALUE. b < Byte.MAX_VALUE. b ) { if (b == 0x90) System.out.print("Joy!"). } } }
或者,你可以用一个屏蔽码来消除符号扩展的影响,从而将byte转型为int,之后你就可以拿一个int与另一个int进行比较了: if ((b &. 0xff) == 0x90) System.out.print("Joy!").
上面的两个解决方案都可以正常运行,但是避免这类问题的最佳方法还是将常量值移出到循环的外面,并将其在一个常量声明中定义它。下面是我们对此作出的第一个尝试: public class BigDelight { private static final byte TARGET = 0x90. public static void main(String[] args) { for (byte b = Byte.MIN_VALUE. b < Byte.MAX_VALUE. b ) { if (b == TARGET) System.out.print("Joy!"). } } }
遗憾的是,它根本就通不过编译。常量声明有问题,编译器会告诉你问题所在:0x90对于byte类型来说不是一个有效的数值。如果你想下面这样订正该声明,那么程序将运行得非常好: private static final byte TARGET = (byte)0x90.