Java Random 和 StringBuffer 拼图
预测程序的输出
import java.util.Random;
public class GFG {
private static Random rd = new Random();
public static void main(String[] args) {
StringBuffer word = null;
switch(rd.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);
}
}
解决方案:
乍一看,这个程序可能会以相同的可能性打印出 Pain、Gain 和 Main 这三个词,每次运行都不同。但程序的输出始终是ain 。
三个错误共同导致了这种行为。让我们单独看看它们:-
1. rd.nextInt(2) 将返回 0(包括)和 2(不包括)之间的数字,即 0 和 1。因此,我们的程序从不打印“Pain”。
2.第二个bug是case之间没有break语句。无论 switch 表达式的值是什么,程序都将执行该案例和所有后续案例。每个 case 都为变量 word 赋值,最后一个赋值获胜。最后一个分配将始终是最后一种情况(默认),即 new StringBuffer('M')。这表明该程序也永远不会打印“Gain”。
3.最后一个也是最微妙的错误是表达式 new StringBuffer('M') 可能没有按照您的想法执行。没有 StringBuffer(char) 构造函数。但是有一个采用 int 表示其初始容量。在这种情况下,编译器选择 int 构造函数,应用扩展原语转换将 char 值“M”转换为 int 值 77。
换句话说,new StringBuffer('M') 返回一个初始容量为 77 的空字符串缓冲区。程序的其余部分将字符a、i 和 n 附加到空字符串缓冲区并打印出其内容,这些内容总是'是'。