`
dandy
  • 浏览: 67283 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

不劳无获

    博客分类:
  • java
阅读更多
出自java puzzle

public void phymes(){
		Random rnd = new Random();
		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。看起来该程序会根据随机数生成器所选取的值来选择单词的第一个字母:0选M,1选P,2选G。谜题的题目也许已经给你提供了线索,它实际上既不会打印Pain,也不会打印Gain。也许更令人吃惊的是,它也不会打印Main,并且它的行为不会在一次又一次的运行中发生变化,它总是在打印ain。
有三个bug凑到一起引发了这种行为。你完全没有发现它们吗?第一个bug是所选取的随机数使得switch语句只能到达其三种情况中的两种。

Random.nextInt(int)的规范描述道:“返回一个伪随机的、均等地分布在从0(包括)到指定的数值(不包括)之间的一个int数值”[Java-API]。这意味着表达式rnd.nextInt(2)可能的取值只有0和1,Switch语句将永远也到不了case 2分支,这表示程序将永远不会打印Gain。nextInt的参数应该是3而不是2。
这是一个相当常见的问题源,被熟知为“栅栏柱错误(fencepost error)”。这个名字来源于对下面这个问题最常见的但却是错误的答案,如果你要建造一个100英尺长的栅栏,其栅栏柱间隔为10英尺,那么你需要多少根栅栏柱呢?11根或9根都是正确答案,这取决于是否要在栅栏的两端树立栅栏柱,但是10根却是错误的。要当心栅栏柱错误,每当你在处理长度、范围或模数的时候,都要仔细确定其端点是否应该被包括在内,并且要确保你的代码的行为要与其相对应。

第二个bug是在不同的情况(case)中没有任何break语句。不论switch表达式为何值,该程序都将执行其相对应的case以及所有后续的case[JLS 14.11]。因此,尽管每一个case都对变量word赋了一个值,但是总是最后一个赋值胜出,覆盖了前面的赋值。最后一个赋值将总是最后一种情况(default),即new StringBuffer{'M'}。这表明该程序将总是打印Main,而从来不打印Pain或Gain。
在switch的各种情况中缺少break语句是非常常见的错误。从5.0版本起,javac提供了-Xlint:fallthrough标志,当你忘记在一个case与下一个case之间添加break语句是,它可以生成警告信息。不要从一个非空的case向下进入了另一个case。这是一种拙劣的风格,因为它并不常用,因此会误导读者。十次中有九次它都会包含错误。如果Java不是模仿C建模的,那么它倒是有可能不需要break。对语言设计者的教训是:应该考虑提供一个结构化的switch语句。

最后一个,也是最微妙的一个bug是表达式new StringBuffer('M')可能没有做哪些你希望它做的事情。你可能对StringBuffer(char)构造器并不熟悉,这很容易解释:它压根就不存在。StringBuffer有一个无参数的构造器,一个接受一个String作为字符串缓冲区初始内容的构造器,以及一个接受一个int作为缓冲区初始容量的构造器。在本例中,编译器会选择接受int的构造器,通过拓宽原始类型转换把字符数值'M'转换为一个int数值77[JLS 5.1.2]。换句话说,new StringBuffer('M')返回的是一个具有初始容量77的空的字符串缓冲区。该程序余下的部分将字符a、i和n添加到了这个空字符串缓冲区中,并打印出该字符串缓冲区那总是ain的内容。
2
0
分享到:
评论

相关推荐

    三年级语文上册寓言两则 《水滴石穿》、《守株待兔》教案 西师大版 教案.doc

    学生在模仿农夫的心理活动和情感变化中,体会到不劳无获的道理,从而明白不应依赖偶然的机会,而应脚踏实地地付出努力。 这两则寓言的教学,不仅要求学生掌握生字词,更重要的是理解成语背后的道理,培养他们的思考...

    人教版高中英语选修6语篇提能练习题及答案解析26份19精选.doc

    读者最初可能认为这个消息太好以至于不敢相信,但他们会发现,通常所说的“不劳无获”在这个情况下并不适用。因此,克雷格的方法被认为是世界上最有效的戒酒治疗方法之一。 问题解答: 1. 克雷格·贝克为什么削减...

    大班语言活动:守株待兔.docx

    这篇大班语言活动旨在通过生动的故事讲解,引导幼儿理解“不劳无获”的道理,培养他们的语言表达能力和逻辑思维能力。以下是对这个活动的详细解析: 活动开始时,教师展示幼儿用书,引发幼儿的兴趣。通过观察图片,...

    八年级上册能力训练测试卷下载【语文版】3.doc

    - "不劳无获"的近义名言:没有耕耘就没有收获,一分耕耘一分收获。 9. 漫画理解:这部分要求观察并理解漫画内容,然后表达个人感受。由于具体内容未提供,无法给出具体解析。通常,这类问题需要分析画面中人物行为...

    【小学英语】小学六年级感恩父母英语作文.doc

    虽然初次尝试并不成功,但在妈妈的指导下,作者成功完成了家务,并从中体会到了付出的喜悦,进一步理解了“不劳无获”的道理。 这些作文不仅锻炼了学生的英语写作技巧,还引导他们思考如何用英语表达内心的情感,...

    英语组教师寄语.doc

    8. "No pains, no gains."(不劳无获) - 简单明了,没有付出就没有回报,学习的过程需要努力。 9. "A good beginning is half a success."(良好的开端是成功的一半) - 强调开始阶段的准备和态度对最终结果的影响...

    人教版英语考查常识和习语练习全集.docx

    3. "No pain, no gain"(不劳无获)强调成功往往需要付出努力和牺牲。第三题中的商业人士花了十年时间建立事业,付出很大努力。 4. "Actions speak louder than words"(行动胜于言语)表明实际行动比空洞的承诺更...

    大学生感恩老师心得体会报告.docx

    此外,他们引用了“不劳无获”的谚语,强调了努力的重要性。他们明白,党和国家的资助是他们成长的助力,但也需要自己付出努力,才能真正实现自我价值。因此,他们坚定信念,克服困难,决心通过自身的奋斗,为社会和...

    守株待兔教学反思一.docx

    这个故事揭示了一个深刻的道理:不劳无获,不能依赖侥幸心理生活。 在教学过程中,寓言故事的教学方法至关重要。首先,以阅读为基础,让学生充分接触文本,通过多种形式的朗读,如个人读、领读、分组读等,增强学生...

    2016高考英语热门话题优秀范文WorkandSuccess付出与成功素材

    描述中提到的“no pain, no gain”是英文中一句常见的谚语,意为“不劳无获”,强调了成功往往伴随着艰辛的努力。 在标签“课件”的背景下,这部分内容可能作为高中英语教学材料的一部分,帮助学生准备高考写作部分...

    励志成语大全八字成语-4页.pdf

    19. **人生在勤,不索何获**:鼓励人们勤奋工作,不劳无获。 20. **读书百遍,而义自见**:通过反复阅读,能深入理解书中的含义。 这些成语不仅是语言的艺术,更是生活哲学,它们在日常生活中指导我们如何做人、...

    新人教统编版五四制三年级下册语文 守株待兔教学反思二.docx

    《守株待兔》这篇语文课文是一篇富有哲理的寓言故事,旨在教导学生理解“不劳无获”的道理。在教学过程中,注重朗读的训练和理解的深化是关键。通过各种形式的朗读活动,如个别读、领读、男女比赛读等,学生不仅能...

    外研版高中英语必修二Module 1作业题及答案解析6套11精选.doc

    - 谚语(proverb):"不劳无获",表示付出努力才能得到回报。 - 受伤(injury):受伤可能导致腿部三个月无法活动。 - 稀有的(rare):白虎在这个地区非常罕见,几乎看不到。 - 渴望(anxious):艾伦渴望完成...

    高一英语必修3Unit 1 Festivals around the world 同步练习(二)精选.doc

    2. gains - 你还记得那句老话“不劳无获”吗? 3. independence - 尼日利亚于1960年从英国独立。 4. energetic - 他是个精力充沛的男孩,总是努力工作或玩耍。 5. possibility - 人类登月的可能性已经被证实。 6. ...

    学习总结-工作心得体会一句话60句大全_1.docx

    5. **付出与收获**:不劳无获,想要得到就必须付出。珍惜工作,全身心投入,才能创造出更大的价值。 6. **尊重他人**:认可同事的努力,无论大小成就,因为任何成绩都离不开团队的支持。不要轻视任何人的贡献。 7....

    2018年七年级语文上册第六单元22寓言四则练习新人教版20180809311

    3. 成语学习:寓言故事对成语文化的贡献,如“守株待兔”寓意不劳无获,反对依赖侥幸心理;“揠苗助长”则告诫人们做事不能急躁,急于求成反而会适得其反。 4. 综合实践活动:寓言具有讽刺、劝诫、智慧和故事的特征...

    新五四制人教统编版五年级下册语文 范文1: 一幅漫画的启示 教学课件.pptx

    总的来说,这篇教学课件巧妙地通过一幅漫画,引导学生深入思考,理解不劳无获的道理,培养他们勤奋、耐心和坚韧的精神品质,这对于他们的成长和未来具有深远的影响。在教学实践中,教师可以结合此课件,设计各种活动...

    三年级语文下册第二单元5守株待兔备课素材新人教版

    故事告诫人们不能依赖偶然的幸运,应当依靠勤劳才能获得收获,揭示了不劳无获的道理。 3. **韩非与《韩非子》** - 韩非是战国末期韩国的公子,是法家思想的重要代表人物,他的著作《韩非子》集法家思想之大成。...

    经典交流英语汇总.doc

    "(不劳无获)则强调努力的重要性。 7. **约定与提醒**:"I'll be in touch"(保持联络)和"Please keep me informed!"(请一定要通知我)用于确保信息的畅通,"Make up your mind"(作个决定吧)则敦促他人做出...

    新学期新气象英语演讲稿.docx

    6. 英语表达与修辞:演讲稿中运用了一些英语表达,如"How time flies"(时光飞逝)和"no pains, no gains"(不劳无获),这些是英语中常用的成语,体现了演讲者良好的英语基础。同时,演讲稿的结构和用词也展示了...

Global site tag (gtag.js) - Google Analytics