Java随机和字符串缓冲区之谜

预测程序的输出

null

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,在不同的运行中有所不同。但程序的输出总是 艾因 . 三个臭虫合谋导致了这种行为。让我们逐一看看:- 1. rd.nextInt(2)将返回介于0(含)和2(不含)之间的数字,即0和1。因此,我们的程序从不打印“痛苦”。

2. 第二个错误是案例之间没有break语句。无论开关表达式的值是多少,程序都将执行该情况和所有后续情况。每种情况都为变量字赋值,最后一次赋值获胜。最后一个赋值始终是最后一种情况下的赋值(默认值),即new StringBuffer(’M’)。这表明该程序也不会打印“增益”。

3. 最后一个也是最微妙的错误是,表达式new StringBuffer(’M’)可能与您认为的不同。没有StringBuffer(char)构造函数。但有一种是用int表示初始容量的。在本例中,编译器选择int构造函数,应用扩展原语转换将char值“M”转换为int值77。在里面 换句话说,new StringBuffer(’M’)返回一个初始容量为77的空字符串缓冲区。程序的其余部分将字符a、i和n附加到空字符串缓冲区,并打印出其内容,这些内容始终为“ain”。

本文由 Shubham Juneja .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享