不劳而获
来源:互联网 发布:js中window对象的方法 编辑:程序博客网 时间:2024/05/21 10:53
下面的程序将打印一个单词,其首字母有一个随机生成器选择,请描述改程序的行为:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {
private static Random rnd = new Random();
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);
}
咋一看这个程序可能会在一次又一次的运行中以相等概率的输出Pain, Gain, Main.是这样吗?
聪明的您可能发现问题了, Random.nextInt(int n)的范围是在0-n之间,含0不含n,所以整体上Random.nextInt(2)只会产生0或者1,所以程序是不会打印出Gain的,应该是等概率的输出Main与Pain。(栅栏柱错误)
看起来似乎正确了,但是哪里还是有些问题。看到了,是switch循环后面没有加上break,这样的话,Random.nextInt(2)产生1时会将3个case语句全部执行,也即相当于执行default里的语句;Random.nextInt(2)产生0时也是执行default里的语句,这样下来最终的结果只能有一个,那就是Main了。(switch-case-break错误)
复制代码,运行一下,发现结果是ain,不管运行多少次,结果都是一样的,为什么没有打印出M呢,下面我们来看一下StringBuffer,StringBuffer类没有对应的字符构造函数,在eclipse中可以将鼠标放在case中的构造器中,提示了一下内容:
2
3
4
5
6
7
8
Constructs a string buffer with no characters in it and the specified initial capacity.
Parameters:
capacity the initial capacity.
Throws:
NegativeArraySizeException - if the capacity argument is less than 0.
这下明白了,原来StringBuffer('M')在构造的时候,是构造了一个容量为'M'对应ascii值大小的初始容量,之后再附加字符之前,都没有任何内容,所以最终的结果始终是Main。(非常规方法使用错误)
上面的3处错误或者问题是经常出现的,希望大家都能够多注意。
摘自: Java疑惑 之 不劳而获 章节
更多文章请前往小胖轩.
- 不劳而获
- 无为而治 不劳而获
- 朗科不劳而获秘诀:专利生存
- 天下没有不劳而获的东西
- 女人典型六种金钱性格 爱财如命不劳而获
- 327. Nothing is to be got without pains but poverty. 世上唯有贫困可以不劳而获
- 《Java解惑》系列——02字符谜题——谜题23:不劳而获(java编程中的一些常见陷阱)
- 关于项目文件导入打开报:无法识别元素 <Target> 中的属性“Returns”错误解决方法
- Objective-C相关Category的收集
- android 视图(View)是否可见状态
- C语言获取系统时间的几种方式
- 第11周项目1(3)-输出字母
- 不劳而获
- 常用的邮箱服务器(SMTP、POP3)地址、端口
- 编写计划
- android WIFI学习总结
- 那些不能错过的Xcode插件
- 微信公众平台开发(5)-上传下载多媒体文件
- 第十一周项目5-当年第几天(循环累加、简单)
- JSP页面跳转方法总结
- 黑马程序员_反射学习心得