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

烧焦到无法识别

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

下面这个程序看起来是在用一种特殊的方法做一件普通的事。那么,它会打印出什么呢?
public class Greeter{
  public static void main(String[] args){
    String greeting = "Hello World";
    for(int i = 0; i < greeting.length(); i++)
      System.out.write(greeting.charAt(i));
  }
}


尽管这个程序有点奇怪,但是我们没有理由怀疑它会产生不正确的行为。它将“Hello World”写入了System.out,每次写一个字符。你可能会意识到write方法只会使用其输入参数的低位字节(lower-order byte)。所以当“Hello World”含有任何外来字符的时候,可能会造成一些麻烦,但这里不会:因为“Hello World”完全是由ASCII字符组成的。无论你是每次打印一个字符,还是一次全部打印,结果都应该是一样的:这个程序应该打印Hello World。然而,如果你运行该程序,就会发现它不会打印任何东西。那句问候语到哪里去了?难道是程序认为它并不令人愉快?
这里的问题在于System.out是带有缓冲的。Hello World中的字符被写入了System.out的缓冲区,但是缓冲区从来都没有被刷新(flush)。大多数的程序员认为,当有输出产生的时候System.out和System.err会自动地进行刷新,这并不完全正确。这2个流都属于PrintStream类型,在5.0版[Java-API]中,有关这个类型的文档叙述道:
一个PrintStream可以被创建为自动刷新的;这意味着当一个字节数组(byte array)被写入,或者某个println方法被调用,或者一个换行字符或字节(‘\n’)被写入之后,PrintStream类型的flush方法就会被自动地调用。

System.out和System.err所引用的流确实是PrintStream的能够自动刷新的变体,但是上面的文档中并没有提及write(int)方法。有关write(int)方法的文档叙述道:将指定的byte写入流。如果这个byte是一个换行字符,并且流可以自动刷新,那么flush方法将被调用[Java-API]。实际上,write(int)是唯一一个在自动刷新(automatic flushing)功能开启的情况下不刷新PrintStream的输出方法(output method)。
令人好奇的是,如果这个程序改用print(char)去替代write(int),它就会刷新System.out并打印出Hello World。这种行为与print(char)的文档是矛盾的,因为其文档叙述道[Java-API]:
打印一个字符:这个字符将根据平台缺省的字符编码方式被翻译成为一个或多个字节,并且这些字节将完全按照write(int)方法的方式被写出。
类似地,如果程序改用print(String),它也会对流进行刷新,虽然文档中是禁止这么做的。相应的文档确实应该被修改为描述该方法的实际行为,而修改方法的行为则会破坏稳定性。

修改这个程序最简单的方法就是在循环之后加上一个对System.out.flush方法的调用。经过这样的修改之后,程序就会正常地打印出Hello World。当然,更好的办法是重写这个程序,使用我们更熟悉的System.out.println方法在控制台上产生输出。

尽可能使用熟悉的惯用法;如果你不得不使用陌生的API,请一定要参考相关的文档。这里有3条教训给API的设计者们:请让你们的方法的行为能够清晰的反映在方法名上;请清楚而详细地给出这些行为的文档;请正确地实现这些行为。
1
1
分享到:
评论

相关推荐

    java 谜题95

    乒乓(加强补充线程内容) 126 谜题77:搞乱锁的妖怪 127 谜题78:反射的污染 130 谜题79:这是狗的生活 133 谜题80:更深层的反射 135 谜题81:烧焦到无法识别 137 谜题82:啤酒爆炸 138 谜题83...

    小学数学数学神探一张烧焦了的遗嘱

    小学数学数学神探一张烧焦了的遗嘱

    PowerPoint制作图片烧焦效果的方法.docx

    PowerPoint制作图片烧焦效果的方法.docx

    电子政务-光伏直流供电防烧焦的高压锅.zip

    电子政务-光伏直流供电防烧焦的高压锅.zip

    scorchGore:烧焦游戏

    斯科尔戈尔烧焦游戏#intentallyugly

    keycheck:使用密钥库验证烧焦的 android APK

    这对于在将 APK 上传到 Google Play 商店之前验证您的 APK 是否已正确签名和有效非常有用。要求任何 linux 发行版。 已安装和可用的 keytool(与 android SDK 一起提供) 你也必须知道密钥的密码别名及其密码用法...

    保护你的系统不受反向电流的影响

    在使用电子元器件时,你有时候不可避免地会闻到明显是芯片烧焦的味道。这都是反向电流惹的祸。反向电流就是由于出现了高反向偏置电压,系统中的电流以相反的方向运行;从输出到输入。幸运的是,有很多方法可以保护你...

    如何快速识别电路板上哪个零件坏了

    前两种电阻应用最广,其损坏的特点一是低阻值(100Ω以下)和高阻值(100kΩ以上)的损坏率较高,中间阻值(如几百欧到几十千欧)的极少损坏;二是低阻值电阻损坏时往往是烧焦发黑,很容易发现,而高阻值电阻损坏时很少有...

    IPL-2008-2020-Data-Analysis-using-R

    : select IPL+Matches+ #DATASET说明栏名类型描述ID整型分配给每个比赛的唯一ID城市烧焦进行比赛的城市日期烧焦比赛进行的日期player_of_match烧焦比赛的人会场烧焦进行比赛的体育场团队1烧焦两支球队中的第一支...

    Pico-LCD:在8位模式下将液晶显示器与Raspberry Pi Pico一起使用的模块

    打印演示 到LCD,仅用于测试。 :slightly_smiling_face: -- 写 将字符串打印到LCD。 文本 烧焦 将字符打印到LCD。 烧焦 命令 执行给定的二进制指令。 命令 宾查尔 将二进制字符打印到LCD。 烧焦 清除 清除...

    石油焦燃烧器烧焦管内固体颗粒的停留时间分布实验研究 (2006年)

    制备了过渡金属离子Ag+,Cu+,Co+,Ni+的络合吸附剂Ag-SiO2,Ag-A1203,Ag-Y,Cu-Y,Co-Y,Ni-Y,分别在氮气和氦气环境中,450℃条件下,对Cu-Y进行了自动还原处理,制备吸附...吸附剂对硫的破点吸附量由小到大的顺序为Na-Y,Ni-Y,Co

    电脑基础培训资料.doc

    电脑基础培训资料 上海爱信诺航天信息有限公司 微机故障常用检测方法 一.微机假故障现象 1、电源插座、开关:很多外围设备都是...不同时候死机的处理方法:如果是在系统启动期间发生的死机,请转到第6步;如果是 在

    基础电子中的保护你的系统不受反向电流的影响

    导读: 在使用电子元器件时,你有时候不可避免地会闻到明显是芯片烧焦的味道。这都是反向电流惹的祸。反向电流就是由于出现了高反向偏置电压,系统中的电流以相反的方向运行;从输出到输入。幸运的是,有很多方法...

    data-structure:所有关于数据结构和算法的信息

    目录问题陈述识别数据结构定义算法 数据结构和算法简介 为什么我们需要数据结构? 检查解决问题的技能以及以下技能编码基础基础数据结构(数学和复杂性) 数据结构数据结构正在组织/构造/管理内存中的数据,它是数据...

    airbnb-clone

    烧焦 ○ 描述 文本 ○ 国家 django_countries ○ 城市 烧焦 ○ 价格 整数 ○ 地址 烧焦 ○ 来宾 整数 ○ 床 整数 ○ Bedromms 整数 ○ 浴场 整数 ○ 报到 时间 ○ 查看 时间 ○ Instant_book 布尔型 ...

    14Q--培训资料.pptx

    坠地或落入机器设备中的产品,以及无法判别归类的产品必须作报废处理 Q12 Eg. 1、落地产品的管理台账2、落地产品的标识方法 14Q--培训资料全文共24页,当前为第20页。 只允许提供正确的产品以供取用和安装 Q13 无,...

    电子维修中的海尔全自动洗衣机维修示例

    测电磁阀的阻值为7kΩ左右(数字万用表测),进水阀的阻值为儿十欧(这—点初维修全自动洗衣机的要注意,以免误判),再测脱水时电磁阀两端电压才几伏,顺着到排水电磁阀的插座找到可控硅,与其他几只比较在路测试...

    海尔全自动洗衣机维修示例

    测电磁阀的阻值为7kΩ左右(数字万用表测),进水阀的阻值为儿十欧(这—点初维修全自动洗衣机的要注意,以免误判),再测脱水时电磁阀两端电压才几伏,顺着到排水电磁阀的插座找到可控硅,与其他几只比较在路测试...

    电力谐波引起电缆燃烧的原因分析

    从电力电缆传输中存在的谐波电流出发,对电缆谐波阻抗模型的主要参数进行了估算,...仿真结果表明,在系统参数和电缆漏电容巧合的情况下,流过电缆漏电容的谐波电流被放大,高次谐波电流致使电缆绝缘介质发热并烧焦起火。

Global site tag (gtag.js) - Google Analytics