第二十一题:我的类是什么?
public static void main(String[] args) {
System.out.println(Me.class.getName().replaceAll("\\.", File.separator)+"class");
}
这个程序在我的机子上报错,提示非法参数异常: character to be escaped is missing(要转义的字符丢失),原因是因为我的OS是Windows,在Windows上File.separator会转为反斜杠\,是转义字符的开始,后面缺失字符,报错。在java中 String str = “\”;是不能通过编译的。解决方法可以使用replace方法,它的两个参数是字符序列CharSequence,查看源码可以看到已经使用了Matcher.quoteReplacement()处理过了第二个参数,与书上第一个解决方法一致。
public String replace(CharSequence target, CharSequence replacement) {
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}
第二十二题:URL的愚弄
public static void main(String[] args) {
System.out.println("iexplore");
http://www.geogle.com
System.out.println(":maximize");
}
上面的代码是可以运行的,http:是一个标号,常用在双重循环中,用于break或continue跳转。//代表行注释。
标号可以出现在任何语句前面,但如上面代码所示,没什么用处。所以得到的经验教训是:令人误解的注释和无关代码会引起混乱,要仔细写注释,不要写令人误解的代码。
第二十三题:不劳而获
public static void main(String[] args) {
StringBuffer word = null;
switch (rnd.nextInt(2)) {
case 1: word = new StringBuffer('P');
case 2: word = new StringBuffer('G');
default: word = new StringBuffer('M');
}
word.append('a');
word.append('i');
word.append('n');
System.out.println(word);
}
上面的代码始终输出ain,代码有3个bug。
1.首先是使用nextInt(n)会产生0到n-1之间的随机整数,所以case:2这条语句不会直接跳到这执行;
2.第二个是没有break,这是学习switch初学者经常犯得错误,没有break,程序会从跳转的那个case一直往下执行;
3.第三个,也是最重要的那个,StringBuffer没有StringBuffer(char ch)这个构造函数,上面的代码只是调用了StringBuffer(int capacity)这个构造函数,将char解析为int为StringBuffer的容量,实际内容为空,最后添加a,i,n三个字符,也只会输出这三个字符。
第二十四题:尽情享受每一个字节
public static void main(String[] args) {
for(byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE ; b++) {
if(b == 0x90)
System.out.println("Joy!");
}
}
byte为8字节,是有符号的,从-128到127.0x90是16进制的int数字,转为10进制是144,不在byte的范围,当byte与int比较时,会将byte提升到int,会用符号位填充,但是提升后也只是整型的-128到127,然后比较,所以最后没有任何结果输出。