《像计算机科学家一样思考Java》—— 1.3 什么是调试

1.3 什么是调试

像计算机科学家一样思考Java
程序中隐藏的未被发现的错误叫做漏洞(bug),跟踪和修改bug的过程叫做调试(debugging)。程序中存在三种类型的错误,将它们区分开来有助于更快地定位跟踪错误。

1.3.1 语法错误

编译器只能在程序语法正确的情况下才能完成编译任务,否则,编译将失败,程序自然也就不能运行。语法(syntax)是程序的结构和关于该结构的一些规则。

比如,在英语中,一个句子必须以大写的首字母开始,以句点结束。

对于多数读者,少量的语法错误并不是什么大的问题,但编译器就没有这么宽容了。哪怕是很小的语法错误,编译器都会报错并且退出编译过程,你也别想运行程序了。

更糟糕的是,Java中的语法规则比英语还多,而编译器给出的错误信息也不那么有用。在你编程生涯的前几个星期里,你可能会把大量的时间花在语法错误上。随着经验的增加,你的语法错误将会减少,查找错误也会变得更快。

1.3.2 运行时错误

第二种错误类型是运行时错误。之所以叫“运行时错误”,是因为这些错误直到程序运行时才会出现。在Java中,解释器在执行字节码的过程中发生的错误称为运行时错误。

Java是一种趋向于安全的语言,这意味编译器会捕获大量的错误。因此运行时错误并不多见,特别是简单程序。

在Java中,运行时错误称为异常(exception)。在多数情况下,当异常发生时,通常会有窗口或对话框弹出以显示此时程序正在进行的操作。这些信息对于调试来说是很有用的。

1.3.3 逻辑错误和语义错误

第三种错误称为逻辑错误(logicerror)或语义错误(semanticerror)。当程序中存在这样的错误时,编译过程虽然能够完成,也不会生成错误信息,但程序却不能完成正确的工作。具体来说,程序是按照你所写的去执行的,但问题在于你所写的程序并没有表达出你真实的意图。也可以说,此时的程序从语义上讲是错误的。对这种逻辑错误的识别是比较困难的,因为我们必须向后看,根据程序的输出来查找错误。

1.3.4 实验性调试

在本课程中,调试是你将要学习掌握的最重要的技能之一。虽然调试有时是件令人沮丧的事情,但同时也是程序开发中最有趣、最有挑战性和最有价值的活动之一。

调试就像侦探工作一样,你根据一堆线索来推断导致结果的原因。

调试同时也像一门实验性科学。一旦你意识到有什么地方出了错误,你便会修改程序再重新运行。如果你的假设成立,那么你就可以对修改后的结果进行预测,进而离成功更近一步。否则,你不得不做出新的假设。就像Sherlock Holmes所说:“当你排除了所有的不可能后所剩下的,不管有多么的不确定,都是事实。”(出自阿瑟·柯南·道尔《四个签名》)

对于有些人来说,编程和调试是一回事情,即编程是逐步调试直到满足要求的过程。在一开始,程序应该就能运行,然后不断地进行修改,这样,在整个开发过程中,你的程序都是可以运行的。

比如,Linux操作系统包含成千上万行代码,然而它起初只是Linus Torvalds为了研究Intel 80386芯片而开发的一个小程序。Linus一开始只是想实现将输出的“AAAA”字符串变为“BBBB”,后来,就这么一个小程序演化成了Linux操作系统。

在后续章节中,我将针对调试和其他编程实践提出更多的建议。

时间: 2024-10-05 03:32:34

《像计算机科学家一样思考Java》—— 1.3 什么是调试的相关文章

《像计算机科学家一样思考Java》—— 导读

前言 像计算机科学家一样思考Java 我们从别人的发明中享受了很大益处,我们也应该乐于以我们的任何一种发明为别人服务,并且这种事我们应该自愿地和慷慨地去做. --本杰明·富兰克林,引用自Edmund S. Morgan所著的<本杰明·富兰克林传> 我为什么写这本书 1999年,当我还在科尔比学院教书的时候,我便开始写这本书了.现在,这已经是第5个版本了.那时,我正使用Java程序设计语言来教授计算机科学导论课程,但始终没有找到一本合适的教材.一方面,这些书的内容太多,让学生去阅读一本800页的

《像计算机科学家一样思考Java》—— 1.1 什么是编程语言

1.1 什么是编程语言 像计算机科学家一样思考Java你即将学习的语言是Java,这是一种相对较新的语言(Sun公司于1995年5月发布了Java的第一个版本).Java是一种高级语言(high-level language),你可能听过的其他高级语言还有Python.C.C++和Perl. 有了"高级语言",还有低级语言(low-level language),有时候也叫做机器语言或者汇编语言.粗略地说,计算机只能够执行由低级语言编写的程序.因此,由高级语言编写的程序必须先被翻译成低

《像计算机科学家一样思考Java》—— 1.7 练习

1.7 练习 像计算机科学家一样思考Java练习1.1 计算机科学家有一个烦人的习惯,他们会用一些常用的英语单词来表示其他的意思.比如,在英语中,statement和comment的意思是相同的,但是在程序中就不同了. 在本书中,每个章节的最后都附有术语表,列出这些单词和短语的目的是强调它们在计算机科学中的特殊含义.虽然你可能很熟悉某些单词,但它们的意思却有可能和你先前所知道的完全不一样. 1.在计算机行业中,语句(statement)和注释(comment)的区别是什么? 2.说一个程序是可移

《像计算机科学家一样思考Java》—— 1.2 什么是程序

1.2 什么是程序 像计算机科学家一样思考Java程序是说明如何执行计算的一个指令序列1.计算可能是数学计算,比如求解方程组或者寻找多项式的根等:但计算也可以是符号型计算,比如查找和替换文档中的文本或者编译一个程序(够奇怪的). 指令也称作语句(statement),它的格式因不同的编程语言而有所不同.但多数语言都包括一些基本的操作. 输入:从键盘.文件或其他设备获取数据. 输出:在屏幕上显示数据,或者向一个文件或其他设备写入数据. 数学:完成基本的数学运算,比如加法和乘法. 测试:检测特定条件

《像计算机科学家一样思考Java》—— 1.4 形式语言和自然语言

1.4 形式语言和自然语言 像计算机科学家一样思考Java自然语言(Natural languages)指人类所说的语言,比如英语.西班牙语.法语等.自然语言并不是由人类设计的,它们是自然演化而形成的. 形式语言(Formal languages)是人类为了某种应用上的需要而设计的.比如,数学中的各种记号便是一种形式语言,这种语言能够很好地描述数字和符号之间的关系.化学家也用形式语言来表示化学分子的结构,而更重要的是: 编程语言是一种用来表达计算的形式语言. 形式语言对于语法有严格的规则.比如,

《像计算机科学家一样思考Java》—— 1.6 术语表

1.6 术语表 像计算机科学家一样思考Java问题解决(problem-solving):对问题进行建模,寻求解决方案并表达解决方案的过程. 高级语言(high-level language):便于人类阅读和编写的编程语言,比如Java. 低级语言(low-level language):便于计算机运行的编程语言.也叫做机器语言或汇编语言. 形式语言(formal language):人类为了特殊用途(比如表达数学理论或计算机程序)而设计的语言.所有的编程语言都是形式语言. 自然语言(natur

《像计算机科学家一样思考Java》—— 第1章 程序之道

第1章 程序之道 像计算机科学家一样思考Java本书的目的在于教你怎样像一个计算机科学家那样思考.我喜欢计算机科学家思考问题的方式,因为他们能将数学.工程学和自然科学中的最好的特性组合在一起.计算机科学家像数学家一样使用规范的语言来表达思想(特别是计算):像工程师一样进行设计并将不同的组件装配成系统,然后在不同的实现方案中进行权衡:又像科学家一样观察复杂的系统,形成假设,再测试预言. 计算机科学家最重要的技能在于问题解决(problem-solving)技能.他们能够对问题进行简明陈述,创造性地

《像计算机科学家一样思考Python》——3.14 调试

3.14 调试 如果你使用文本编辑器来编写脚本,则可能会遇到缩进时空格和制表符混淆的问题.避免这种问题的最好办法是只使用空格(不用制表符).大部分识别Python的文本编辑器都默认这么处理,不过也有一些不支持. 制表符和空格都是不可见的,因而会很难调试,所以应尝试找一个能帮你处理缩进的编辑器. 另外,不要忘了在运行程序前保存它.有的开发环境会自动保存,但也有不自动保存的.如果不保存,则你写好的代码和运行的代码并不一样. 如果运行的报错的代码和你写的不一样,调试时会浪费很多时间! 所以一定要确保你

《像计算机科学家一样思考Python》——4.10 调试

4.10 调试 函数的接口,作用就像是函数和调用者之间签订的一个合同.调用者同意提供某些参数,而函数则同意使用这些参数做某种工作. 例如,polyline需要4个参数:t必须是一个Turtle:n是边线的个数,所以必须是整数:length应当是个正数:而angle则必须是一个数字,并且按照度数来理解. 这些需求被称为前置条件,因为它们应当在函数开始执行之前就保证为真.相对地,函数结束的时候需要满足的条件称为后置条件.后置条件包含了函数预期的效果(比如画出线段)以及任何副作用(比如移动乌龟或者引起