(2019春)软件构造:雨课堂试卷(第7章)

7-1 健壮性与正确性

单选题 第1题 1分

关于robustness和correctness的说法,正确的是__

A 即使用户输入是不符合spec的,需要优雅的提示错误、合理终止或继续运行
B “对自己的代码要保守,对用户的行为要开放”,前者针对的是robustness,后者针对的是correctness
C 程序员应总是认为client总是可以遵循spec,这是面向robustness的编程思想
D 健壮性编程倾向于直接报错(error),正确性编程则倾向于容错(fault-tolerance)

正确答案:A

填空题 第2题 3分

(1)你在Lab1编写从外部文件读入数据来构造magic square的程序。你发现读入的文件中,两个数字之间并非总是按spec期望的\t分割,于是你决定,只要遇到非\t分割的数字,就直接退出。这是面向 [填空1] 的编程。

(2)你要求用户输入16位数字的信用卡号码,结果你检测到用户输入了17位。你决定截取前16位数字作为用户输入,进入后续处理。这是面向 [填空2] 的编程。

(3)你在Lab3里读取外部文本文件,发现文件里小于10000的数字也采用了科学计数法,不符合spec。为此你决定接受这种输入,程序自动将其转为常规数字形式。这是面向 [填空3] 的编程。

可以填写:正确性、健壮性、不合理

正确答案:
正确性;不合理;健壮性

多选题 第3题 2分

关于robustness和correctness的说法,不正确的是__

A Make your external interface robust, and make your internal code correct
B 前者是为了让用户easy to use,后者是为了让开发者easy to develop
C 过分追求健壮性会让用户不愿意使用你开发的ADT
D 过分追求正确性会让开发者写代码变得过于复杂

正确答案:CD

多选题 第4题 2分

以下更适用于使用面向robustness进行开发的场景包括_

A 嫦娥四号探月飞船上的控制软件
B 新浪娱乐上的明星动态跟踪与搜索功能
C iPhone XS上的App授权管理功能
D 波音737 MAX 8上的MCAS防失速系统
E HIT CS32207的Lab1-Lab6,有几个随意更改你输入文件内容的TA

正确答案:BE
答案解析:

D:根据目前新闻报道,很多专家认为:目前的波音737 MAX 8上的MCAS防失速系统,读取了错误的传感器数据,在未加其他校验机制的情况下,就启动下压机头的动作——对correctness的追求不够

多选题 第5题 2分

关于error、fault、failure的术语区分,说法不正确的是__

(咬文嚼字没什么意思,但还是需要尽量明白“行话”是啥)

A 你将a.equals(b)写成了a==b,这是一个error
B 程序运行时抛出了一堆红色的stack trace,这是一次fault
C 你在checkRep()中用assert xx检查RI,这是为了避免在ADT代码中引入failure
D 你通过debug定位了bug所在,这是为了找出潜藏的fault
E你修复了有bug的代码,这是消除了error

正确答案:BC

##多选题 第6题 2分
用于支持robustness的构造方法包括___

A 在代码中使用assertion
B 在各方法最后使用checkRep()
C 保证ADT不出现rep explosure
D 检查pre-condition,一旦发现违反,告知client,要求client重新输入数据
E 检查pre-condition,一旦发现违反,抛出异常,结束程序运行
F 检查pre-condition,一旦违反则抛出Exception

正确答案:D
//个人认为是:ABDF

填空题 第7题 1分

Java中用来处理错误和异常的最高层次的接口是 [填空1]
错解:Exception
只需填写接口名,无需带包名。

正确答案:Throwable

填空题 第8题 2分

用于使ADT具备排序功能的Java接口或抽象类是 [填空1] 或 [填空2]
Comparable;Comparator
只需填写接口/抽象类名,无需带包名。

正确答案:
Comparator;Comparable

7-2 错误与异常处理

多选题 第1题 2分

以下___可归属error的范畴?

A Java虚拟机无法为对象分配足够内存,导致内存溢出
B 因为磁盘故障导致文件不可读出
C 因为使用了超过数组长度的下标来读取数组中的数据,导致无法读出
D 运行时无法找到所需要的class文件

正确答案:ABD

多选题 第2题 2分

关于Java异常处理的说法,不正确的是__

A RuntimeException是由程序员在代码里处理不当造成的,是代码中的潜在bug
B 除RuntimeException之外,Exception类的其他子类型异常均是程序员所无法控制的,一旦发生就只能等着程序退出
C RuntimeException及其子类所定义的异常,称为unchecked exception
D 除RuntimeException及其子类之外的其他Exception均可归结为checked exception

正确答案:B

多选题 第3题 2分

从异常名字来判断,__属于checked类型的异常

A NullPointerException
B NumberFormatException
C FileNotFoundException
D NegativeArraySizeException
E ClassCastException

正确答案:C

多选题 第4题 2分

关于checked和unchecked异常,说法不正确的是__

A 前者需要try/catch,后者不需要/不必要/不应该try/catch
B 前者可以自定义新的异常类型,后者不可以
C 前者一旦发生,无法补救;后者一旦发生,程序员可以采取措施补救
D Client更希望开发者使用后者;而开发者若倾向于使用前者,则会让代码变得更简洁更易读
E 前者将随常规代码一并交付客户使用,后者则不应出现在交付代码中

正确答案:BCDE
答案解析:
A:Unchecked 异常也可以使用 throws 声明或 try/catch 进行捕获,但大多数时候是不需要的,也不应该这么做

B:二者都可以定义新类型,分别继承自不同的父类

D:client希望使用checked异常,因为可以提示更清晰的错误信息并加以补救,避免程序的直接退出;开发者若倾向于使用checked异常,则会让代码变得更复杂(各种各样的try/catch)。相比较而言,使用unchecked异常会让代码简洁易读(只需要在发生异常的现场throw new XxxException(…)即可)

E:unchecked虽然无法恢复,但如果代码中有遗留问题,不可避免的抛出unchecked异常,不存在交付不交付给用户一说

单选题 第5题 1分

以下说法正确的是__

A 如果父类型中的某个方法声明中未throws任何checked异常,那么子类型中override该方法时,在override方法内部抛出或捕获的任何异常必须被在方法内捕获并处理
B RuntimeException一定不会出现在方法定义的throws关键字之后,也一定不会出现在方法内的throw关键字之后
C 如果某个方法中包含了throw new xxException(…)这样的代码,则该方法的spec种一定会包含throws xxException
D 某行代码w调用了一个方法methodA,若methodA的spec中使用throws抛出了一个checked exception,那么该行代码w必须要被包含在try-catch块中

正确答案:A

答案解析:

A选项:如果不理解它为何正确,考虑LSP

B选项:RuntimeException是unchecked异常,但这跟throws和throw关系词没关系,可以出现在它们后头,表示抛出异常。

C选项:除非xxException是checked exception,否则不需要出现在方法spec中

D选项:不一定,此行代码所在的方法可以继续将捕获到的该异常往其调用的client端抛出,即w所在的方法spec中也有throws同样的异常

这道题目比较晦涩,各位仔细体验一下。(虽然这里描述的大部分规则都是由static type checking帮你做了,但是你还是要理解其原理)

单选题 第6题 1分

以下场景最适合使用checked exception的是___

A 某个方法中,判断client传递进来的参数是否符合方法的pre-condition
B 某个方法中,在return语句之前,判断该方法所在类的RI是否满足
C 在读取文件的过程中,发现磁盘上找不到该文件
D 访问数组时越界,例如a[-1]=0

正确答案:C
答案解析:

RI, pre-condition, post-condition,最好的处理方式是assertion,目的是fail fast,因为这是编程错误(要么是client的错,要么是developer的错)

数组越界,也是同样的道理
ABC都是程序猿的锅。client是客户端,不是用户
只有C选项,不是程序员的锅,那就老老实实try/catch吧。

多选题 第7题 2分

关于Java try/catch/finally的语法,以下说法不正确的是__

A 如果try{…}中第2行代码抛出了异常,则第2行之后至try的“}”之间的代码不会再被执行
B 如果try{…}中的代码抛出了异常但没有被后面的任何catch{…}所捕获,则finally{…}中的语句不会被执行
C finally{…}中的语句不能再抛出并捕获异常了,即其中不应再出现throw/try/catch语句
D 如果采用try(…){…}的语法,则不再需要finally{…}了

正确答案:BC

单选题 第8题 1分

某时刻的JVM stack如右图所示,且C方法执行中抛出一个checked异常XX。以下说法不正确的是__
在这里插入图片描述
A 若C未捕获未处理XX,则XX被传递给B
B 若C未捕获未处理XX,则B的方法声明中有throws XX的字样,则XX被传递给A
C 若A、B的方法声明中都没有throws XX的字样,则XX在B中被捕获被处理
D 若该异常XX被传递给main且main也没处理它,则程序将被终止,console打印出血红的stack trace

正确答案:C

多选题 第9题 2分

try {

} catch(XXException e) {
e.printStackTrace();
print(e.getMessage());
}
针对上述代码的code review,说法正确的是__

A 很正常的代码,用try/catch捕获和处理checked异常
B printStackTrace和print message有重复,一个就OK了
C 意义很小,除了打印输出stack trace和错误提示,没有对异常做任何恢复处理
D 如果没法恢复这个XX异常,最好在print下一行加上throw YYException(…),YY是个unchecked异常

正确答案:CD

单选题 第10题 1分

以下关于异常处理的“位置”的说法,恰当的是__

A 如果某行代码抛出checked异常,最好在该代码所在的方法里捕获该异常并进行恢复处理
B 如果某行代码抛出checked异常,最好不在该方法里处理它,而是将其throws给调用该方法的client加以处理
C 如果某行代码抛出checked异常,如果想要client采取其他行动才能恢复异常,则不要在该代码所在方法里处理
D 如果某行代码抛出unchecked异常,但你不想让程序直接退出,最好应该将其throws给调用该方法的client加以处理

正确答案:C
答案解析:

关键看恢复checked异常需要什么信息、需要提示给用户什么信息。如果这些信息在本方法里无法获取,或者本方法里能获取的与异常相关的信息对用户来说无价值,则将异常往上传递。

Unchecked异常,最好不要throws向上传播。它代表着你程序代码的问题,现场解决(赶紧修改代码来消除它)。——想想你们体育课系统里的ArrayIndexOutOfBoundsException,居然在UI中出现了

7-3 断言与防御式编程(待完成)

多选题 第1题 2分

以下_是defensive programming的有效手段

A 利用Java的static type checking
B 尽可能让ADT为immutable的,rep为final和private
C 在方法的第一行进行参数合法性检查,是否符合spec里的pre-condition
D 在方法的return之前调用checkRep()
E 使用unchecked exception发现代码中的潜在问题
F 先写spec,再设计测试用例,最后写代码,每次代码更新都regression test

正确答案:ABCDEF

多选题 第2题 2分

以下关于assertion的说法,不正确的是_

A assert主要用于开发阶段,帮助开发者发现代码中潜在错误
B 在代码中某位置加入assert语句,用于判定程序运行到此应满足的条件。若为假,意味着代码出错
C assert后面可以跟一个参数(判定条件),也可以有第二个参数(message)
D 若代码中的assert语句太多,会严重影响代码运行性能,所以要慎重使用 E assert语句一旦false,程序绝对无法恢复,只能退出

正确答案:D

多选题 第3题 2分

以下__场合适合于使用assertion?

A checkPep()
B 检查pre-condition是否违反
C 检查post-condition是否违反
D 在程序流程不应该执行到的地方
E 检查外部文件是否存在
F 检查用户通过键盘的输入数据是否合法
G 检查网络是否连通

正确答案:ABCD

单选题 第4题 1分

关于Assertion和Exception的异同之处,正确的是___

A 断言是为了应对robustness,异常处理是为了应对correctness
B 如果开发者能预料到某些特殊情况可能发生,对其用断言加以应对
C 如果开发者希望某些特殊情况绝不能发生,对其用异常处理加以应对
D 开发阶段用断言尽可能消除bug,在release版本里用异常处理机制处理漏掉的错误

正确答案:D

多选题 第5题 2分

从防御式编程的角度看,如果client调用某个方法的时候输入了不符合pre-condition的参数,以下做法不恰当的是__

A 按照spec的定义,开发者可以采取任何行动来处理不合法的输入参数
B 对不合法的输入参数做智能化处理,使之转化为合法的输入参数,再继续计算
C 直接使用assert语句将不合法的输入参数挡在之外,给client呈现错误信息提示
D 抛出异常,向client展示参数为何不合法、何为合法参数

正确答案:AB

填空题 第6题 2分

用于使ADT具备迭代遍历功能并对client提供迭代器对象的Java接口或抽象类是 [填空1] 和 [填空2] 。

只需填写接口或抽象类名,无需带包名。

正确答案:
Iterator;Iterable

填空题 第7题 2分

用于支持实现观察者模式的Java接口或抽象类是 [填空1] 和 [填空2]

只需填写接口或抽象类名,无需带包名。

正确答案:
Observer;Observable

7-4 Debugging

单选题 第1题 1分

Bug这个术语是_最先使用的?

A Ada Lovelace
B Barbara Liskov
C Grace Hopper
D Margaret Hamilton

正确答案:C

单选题 第2题 1分

关于assertion, exception handling, debugging, testing这四种技术之间的关系,不恰当的说法包括__

A 利用断言进行防御式编程,发现代码中的潜在错误;无法预防的问题,通过异常处理在运行时解决
B 防御式编程无法规避所有bug,需通过测试发现其他bug
C 通过assertion、checked exception和testing找出的bug需通过debug进行错误定位并消除之
D 这四种方法都不是万能的,交付的代码中仍然可能隐藏着大量的bug

正确答案:C
答案解析:
Checked exception是能预料发生并能处理的,不算是bug。Unchecked exception是用来帮忙找出不希望发生的情况,即代码里的bug。

多选题 第3题 2分

为何debug占用了几乎50%的开发时间,以下__是可能的原因?

A 出错的症状所在的代码行跟造成出错的“原因”代码行可能相隔很远,甚至不在同一个源文件
B 由计时/定时等原因导致的某些bug,时间不同了,bug出现的症状就可能不同
C 多线程程序中因为线程交错执行(interleaving)的随机性,导致每次执行的次序不同,bug症状可能时隐时现
D 因为外部的动态性,导致多次执行时难以复现完全一样的执行环境或者用户输入

正确答案:ABCD

单选题 第4题 1分

在代码中可能出现的代码行之后加入print或log语句,输出某些变量的值,根据这些值判断是否有bug。该debug策略称为__

A Instrumentation
B Divide and Conquer
C Program Slicing
D Delta Debugging

正确答案:A

单选题 第5题 1分

两个测试用例,测试结果分别是“通过”和“不通过”。
那么,利用EclEmma代码覆盖度工具观察两个测试用例所覆盖的代码行,找出二者的差异,bug很可能就隐藏在差异的代码行里。
该debug策略称为__

A Instrumentation
B Divide and Conquer
C Program Slicing
D Delta Debugging

正确答案:D

单选题 第6题 1分

如果发现某函数输出的某变量a与期望不一致,那么对该函数代码中可能导致变量a的值发生变化的一部分代码进行仔细分析,以发现潜藏bug。该debug策略称为___

A Instrumentation
B Divide and Conquer
C Program Slicing
D Delta Debugging

正确答案:C

单选题 第7题 1分

通过各种debug策略找到bug根源之后,对bug进行修复。以下说法最不恰当的是__

A 在修改代码之前,要将之前的代码commit到仓库里
B 每次最好只针对一个bug进行代码修改
C 针对一个bug修改代码之后,要重新运行之前发现该bug的所有测试用例,已确认该bug是否被完全修复
D 针对一个bug的代码修改,如果没有彻底修复该bug,最好不要将修改的代码commit到仓库

正确答案:C

多选题 第8题 2分

以下__能够为开发者发现bug根源所在提供有效帮助

A git diff v1 v2
B Memory heap dump
C Print stack trace
D System.out.println()
E java.util.logging
F Set breakpoints and use step-by-step debugger
G End users’bug report

正确答案:ABCDEFG

发布了113 篇原创文章 · 获赞 1067 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/JAck_chen0309/article/details/105022489