`
dandy
  • 浏览: 67210 次
  • 性别: 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
分享到:
评论

相关推荐

    手机器件识别PPT学习教案.pptx

    "手机器件识别PPT学习教案" 本文主要讲解手机器件识别,涵盖电源电路识别、输入/输出接口电路、手机中主要元器件识别与检测等内容。 电源电路识别: * 电源电路中,电池电源用VBATT或VBAT表示,也有用VB、B+来...

    从零开始学电子元器件识别与检测技术

    1. 直观检查:观察元器件是否有烧焦、变形、开裂等物理损坏。 2. 万用表测量:使用万用表可以测量电阻、电容、二极管、三极管的直流电阻、交流电阻、电容值、二极管正向压降和反向电阻等。 3. 示波器测试:对某些...

    课题二电阻器的识别与检测PPT学习教案.pptx

    外观检查确保电阻器无破损、烧焦等异常情况。阻值测量可使用万用表进行,选择合适的档位,接触电阻两端,读取显示值,以确认其实际阻值是否与标称值一致。 五、电位器 电位器是一种可变电阻器,通过改变其活动触点...

    主板维修基本流程.pdf

    了解这些插槽的定义,能帮助我们正确识别并处理插槽故障,例如,如果CPU插槽损坏,可能导致无法识别或安装CPU。 进入主板维修基本流程(主板维修基本流程.pdf)。维修流程通常包括以下几个步骤:故障诊断、初步检查...

    机电设备电气线路故障解析.doc

    - **直观检修**:询问使用者了解设备使用情况,通过嗅觉识别烧焦等异常气味。 4. **检修原则** - **严格遵守检修程序**:按部就班,确保检修的系统性和安全性。 - **预防为主**:定期维护,提前发现潜在问题,...

    iPhone4/4S官方拆机维修技术指南下载

    这份指南的内容丰富,涵盖了从基础的故障排查到具体的部件更换操作步骤,还包括了对于设备的识别、故障诊断以及不同情况下的维修建议。尽管文档目前只提供英文版本,但图文并茂,内容详尽,对于苹果用户来说,是一份...

    主板维修流程图

    这可能包括电脑无法启动、系统频繁蓝屏、硬件设备无法识别等。了解这些症状有助于定位问题所在。 2. **安全措施**:在进行任何维修之前,确保关闭电源并断开所有外部设备连接,以防电流冲击或短路。同时,佩戴防...

    计算机组装与维护公开课教案.docx

    例如,查看电源线是否正常、听各部件工作声音是否异常、闻是否有烧焦味以及摸元件温度是否过高,这些都能帮助我们定位问题。 其次,当计算机无法开机或显示异常时,我们需要了解主板的报警声。不同的BIOS芯片,如...

    催化裂化装置操作安全技术.pdf

    总的来说,催化裂化装置的操作安全技术涉及到严格的过程控制、异常情况的识别和迅速响应。为了确保装置的稳定运行和人员的安全,操作人员需要熟悉各个单元的操作特性,及时处理可能出现的问题,并遵循严格的安全规程...

    小学科学实验报告单.doc

    食盐和高锰酸钾在水中溶解,而沙子和粉笔末则不溶,这帮助孩子们理解溶解的概念,即物质在液体中均匀分散并无法肉眼看到的状态。 第三个实验研究如何加快溶解过程,通过对比搅拌和不搅拌冰糖在水中的溶解情况,孩子...

    电脑维修概述课件.pptx

    例如,接触不良是最常见的问题,因为电脑内部的板卡和设备通过接口和数据线连接,任何一处接触不良都可能导致电脑无法正常工作。 识别故障的原则主要有三个。第一,了解故障的具体情况,包括电脑配置、操作系统、...

    电脑故障维修大全精选.doc

    如果遇到显示器黑屏或电脑无法启动等问题,首先要检查电源插座是否正常供电,电源开关是否开启,以及外设如打印机、MODEM等是否连接到电源并开启。确保所有设备的电源线路正常,避免因电源问题导致的假故障。 2. **...

    U盘修复方法

    当遇到U盘插上电脑后无法被识别的问题时,可以尝试以下几种方法: - **检查电脑USB接口**:确保USB接口没有损坏或接触不良。 - **更新USB驱动程序**:前往设备管理器,更新USB控制器下的驱动程序。 - **尝试不同的...

    三相异步电动机常见的5种故障现象及处理方法 (2).pdf

    当电动机因缺相运行而无法启动,即使空载启动也会转速缓慢上升并发出嗡嗡声,同时伴有烟雾和烧焦味。这种情况下,应检查电动机供电回路,如熔丝、开关或接触器触头是否接触不良。修复不良连接,确保三相线路完整,...

    电脑维修厂[文].pdf

    1. **设备无法访问**:系统能识别但无法访问,可能是USB设备供电不足。 2. **设备未识别**:设备无响应或发出异常声音,检查USB供电。 3. **系统启动失败**:接入USB设备导致系统启动错误,检查USB供电和启动文件。 ...

    森林火灾图像数据集.zip

    森林火灾的检测是环境监测和灾害预防的关键部分,因此这样的数据集可能包含大量与火源、烟雾、烧焦区域等相关图像。 描述 "计算机视觉数据集,想预览内容可私信作者" 暗示这个数据集专门用于计算机视觉应用,可能是...

    电脑基础培训资料.doc

    3. 设置问题:例如显示器设置错误可能导致无显示,硬盘设置错误可能导致无法识别。 4. 系统新特性:某些“故障”可能是设备或系统的新特性,如节能模式下,显示器和硬盘会在闲置一段时间后自动关闭。 二、微机故障...

    鄂教版小学四年级(下册)科学教(学)案.doc

    - 实验活动旨在让学生通过实际操作发现土壤中的各种成分,如通过捏土壤感知水分,通过将土壤放入水中观察气泡来确认空气的存在,以及通过燃烧土壤闻到烧焦味来识别腐殖质。 - 教学过程中强调了独立思考和小组合作...

    网络管理员培训资料

    这份新手网管培训手册详尽地介绍了硬件故障的诊断和维修方法,这是网络管理中至关重要的技能,因为硬件问题往往直接影响到整个网络的性能和可用性。 首先,关于主板的故障维修,观察法是初步诊断的基础,通过查看...

    3D打印机配置方式

    注意,文件名中不能包含中文或特殊符号,以免打印机无法识别。 ##### 2. **打印机预热** - **预热顺序**:打印机预热是打印前的重要步骤之一。正确的预热顺序为:“挤出头预热”。预热顺序直接影响打印质量和效率...

Global site tag (gtag.js) - Google Analytics