计算机科学:调试

学习计算机科学的概念,示例问题和解释

大学导师应用商店 大学导师安卓商店

例子问题

←之前 1

例子问题1:程序分析

考虑以下代码:

公共静态类Rectangle {

私双宽,高;

公共矩形(双w,双h) {

宽度= w;

身高= h;

public double getArea() {

返回宽度*高度;

public double getPerimeter() {

返回2 *宽+ 2 *高;

公共静态类Square扩展了矩形{

公共广场(双s) {

超级(s, s);

public static void main(字符串[]args) {

矩形[]rects =新矩形[6];

For (int I = 0;我< 6;我+ +){

If (i % 2 == 0) {

rects[i] = new Rectangle(i+10,i + 20);

其他}{

rects[i] = new Square(i+20);

平方s =矩形[1];

上面的代码有什么错误?

可能的答案:

对于类,您需要使用“implements”,而不是“extends”广场

无法执行最后的赋值操作。

你不能分配广场对象的数组矩形对象。

数组溢出。

的声明中有一个错误矩形数组中。

正确答案:

无法执行最后的赋值操作。

解释

这段代码用交替的Rectangle和Square对象填充6个成员数组。您可以这样做,因为Square类是Rectangle的子类。也就是说,自广场是矩形,可以在Rectangle变量中存储Square对象。然而,尽管矩形[1]是一个正方形,你不能立即将其重新赋值给一个正方形对象。代码现在已经将数组中的所有对象都视为矩形对象。你需要显式地输入cast this来让这一行工作:

正方形s =(正方形)(矩形[1]);

例子问题1:程序分析

下面的代码有什么错误?

Int val1 = -14,val2 = 4;

Final int val3 = 9;

双val4 = 4.1;

双val5 = 3.1;

Val1 = val2 * val3;

Val3 = val1 * 12;

Val5 = val1 - val3;

Val4 = val2 + val5;

可能的答案:

不能对双精度数和整数执行混合加减运算。

你不能用val3通过val2

不能将整数减法的结果赋值给val5

不能将新的整数值分配给val3

您必须定义val2在它自己的线路上。

正确答案:

不能将新的整数值分配给val3

解释

给出的选项中唯一的错误是这段代码为变量赋了一个新值val3,定义为常数。(这是由关键字指示的最后在其声明的其余部分之前。)一旦声明了常量,就不能更改它们。因此,以下代码行将导致编译时错误:

Val3 = val1 * 12;

例子问题1:编译时错误

public static void main(字符串[]args) {

Int [] x = {3,4,4,5,17,4,3,1};

Int [] y = remove(x,4);

For (int I = 0;我< y.length;我+ +){

system . out。Print (y[i] + " ");

公共静态布尔值删除(int[] arr, int val) {

布尔值发现= false;

int我;

(我= 0;我<加勒比海盗。长度& & !发现;我+ +){

If (arr[i] == val) {

发现= true;

如果(发现){

For (int j = i;J < arr.length;j++) {

Arr [j - 1] = Arr [j];

arr (arr)。长度- 1]= 0;

返回发现;

上面的代码有什么错误?

可能的答案:

其中一项作业的类型不匹配

有多个删除选项,该函数不支持

删除方法时,存在一个在使用之前未初始化的变量

输出循环主要会使数组溢出y

代码中没有错误

正确答案:

其中一项作业的类型不匹配

解释

有问题的一行是:

Int [] y = remove(x,4);

注意变量y定义为数组。现在,人们很容易认为(无需仔细观察)删除方法在删除完成后返回数组;但是,逻辑不是这样工作的删除方法。相反,它返回一个布尔值,指示这个删除是否成功(也就是说,它告诉你它是否真的找到了这个值)。因此,你不能做像上面那样的赋值,因为这两种类型是不一样的。也就是说,y是整数数组,而删除返回布尔值!

例子问题1:程序分析

公共接口ServerInstance {

byte [] readBytes ();

布尔writeBytes (byte [] b);

布尔维克();

布尔状态();

无效的睡眠();

公共类MyHost实现了ServerInstance {

布尔值运行= false;

公共布尔唤醒(){

//其他逻辑代码…

返回运行;

公共布尔状态(){

//其他逻辑代码…

返回运行;

公共字节[]readBytes() {

Byte [] buffer = null;

//其他逻辑代码…

返回缓冲区;

公共空间睡眠(){

//其他逻辑代码…

运行= false;

公共字节[]writeBytes(字节[]b) {

//其他逻辑代码…

返回b;

/ /其他方法…

上面的代码有什么错误?

可能的答案:

readBytes方法初始化变量缓冲为空

没有错误

writeBytes方法没有正确定义

睡眠方法不返回任何内容

这个词扩展应该用,不是吗实现了

正确答案:

writeBytes方法没有正确定义

解释

当您实现一个接口时,该接口中定义的所有方法都必须在提议成为这种实现的类中编写。(或者,如果它们没有在那里实现,您需要涉及抽象类——但这不是我们在这里关心的。)方法必须与接口中提出的原型相匹配。在示例代码中,ServerInstance有一个方法writeBytes它返回一个布尔值。然而,并且类将此方法实现为返回一个byte []价值。因为对于具有相同参数集的方法,不能有不同类型的返回值,所以Java将其解释为建议的实现writeBytes (byte [] b),该方法必须返回一个布尔值if并且是实现ServerInstance

例子问题1:调试

公共静态无效foo() {

Int x = 10;Y = 21, z = 30;

Int [] arr = null;

For (int I = 0;我< y;我+ = 4){

Arr = new int[i / 5];

For (int I = 0;我< x;我+ +){

Arr [i] = z / i;

For (int I = 0;我< z;我+ +){

Arr [i] = z * i;

下面哪行代码会导致a编译时错误呢?

可能的答案:

加勒比海盗] =z

加勒比海盗] =z/

intx= 10;y= 21z= 30;

这些线都不会引起a编译时错误

加勒比海盗int/ 5];

正确答案:

intx= 10;y= 21z= 30;

解释

编译中的错误发生在任何代码试图执行之前。因此,它主要是代码中的一个语法错误。在上面的选择中,直线

Int x = 10;Y = 21, z = 30;

后面有分号吗10这将导致该代码后面的代码出现错误

Y = 21, z = 30;

不是有效的Java代码。

这段代码中还有其他错误。加勒比海盗] =z/什么时候会引起除0的错误是0。同时,加勒比海盗] =z会超出数组的边界吗加勒比海盗.但是,这些不是编译时错误。在代码甚至能够运行之前发生的错误!

例子问题1:调试

阶级基础{};

派生类:public Base{

公众:

无效方法(){cout<< "method1\n";}

};

类Derived2: public Base{

公众:

无效方法(){cout<< "method2\n";}

};

int main () {

Base* bp = new Derived();

d2* d2p = bp;

d2p - >方法();

用c++编译和运行程序的结果是什么?

可能的答案:

程序编译并运行,打印"method2"

该程序编译并运行到完成,无需打印任何内容

程序编译并在运行时崩溃。

程序无法编译。

程序编译并运行,打印"method1"

正确答案:

程序无法编译。

解释

在这个问题中,derive1和derive2是基类的子类。如果我们看看这条线:

Base* bp = new Derived();

我们将一个新的派生类赋值给基指针。这将编译。将Base看作一个较大的对象,因为它是父对象,因此将较小的对象复制到较大的对象中是可以接受的。

现在让我们看看这个:

d2* d2p = bp;

这一行将导致程序无法编译。由于基类被认为是“较大的”对象,因此将较大的对象复制到“较小的”对象中将导致无法复制所有内容,这称为切片的问题

我们甚至不需要看下一行,因为我们知道程序会崩溃。

例子问题1:调试

考虑到:

常量int x = 10;

下面哪一个将被编译?

可能的答案:

Int * p = &x

Const int * r = &x

Int * const q = &x

以上所有

以上都不是

正确答案:

Const int * r = &x

解释

首先我们看一下给定的语句:

常量int x = 10;

“int”前面的const意味着x将始终保持10的值,并且它不会改变。

让我们观察所有的选项。

int * p = x

这一行表示将x的地址(在内存中)赋值给指针p。然而,这将不会编译,因为int * p没有被标记为const。X被标记为const类型,因此这迫使int * p也是const类型。

Int * const q = &x

本例中有一个const,但它在错误的位置

Const int * r = &x

const在正确的位置,这是正确的答案

例子问题2:调试

阶级基础{

保护:

无效的方法();

};

派生类:public Base{


};

int main () {

基地b;

b.method ();/ /行

派生d;

d.method ();/ /直线B

下列哪项是正确的?

可能的答案:

这些

行A将编译

行B不会编译

行A不会编译

行B将编译

行A不会编译

行B不会编译

行A将编译

行B将编译

正确答案:

行A不会编译

行B不会编译

解释

要理解这个问题,我们必须理解保护方法的含义。受保护的方法是一种方法,它可以被它自己类中的方法以及它的子类中的方法访问。方法中调用受保护的方法子类

我们可以看到method()是在main内部调用的。这应该已经引起了警觉。受保护的类在子类外部被调用,因此它不会编译。甚至那些被称为对于基类和派生类,调用不会在基类和派生类内部进行,因此这两行都不会编译。

例子问题1:运行时错误

考虑以下代码:

对象[]objects = new对象[20];

For (int I = 0;我< objects.length;我+ +){

开关(i % 4) {

例0:

objects[i] = new Integer(i + 3);

打破;

案例1:

objects[i] = "This val: " + i;

打破;

案例2:

objects[i] = new Double(i * 4.4);

打破;

案例3:

objects[i] = "That val: " + (i*12);

打破;

字符串s =(字符串)对象[8];

System.out.println(年代);

上面的代码有什么错误?

可能的答案:

会有一个NullPointerException。

会抛出一个ClassCastException。

数组溢出。

不能以这种方式为数组分配各种类型。

没有错误。

正确答案:

会抛出一个ClassCastException。

解释

为了理解这段代码中的错误,您必须理解循环在做什么。的数组分配变量类型对象根据循环控制变量除数的余数计算除以4。这样就得到了一个重复的模式:

整数,字符串,双精度,字符串,整数,字符串,双精度,字符串,…

现在,索引8将是一个Integer(因为它的余数为0)。这意味着当你将类型转换为String时,你将收到一个TypeCastException读取的行:

字符串年代=(字符串)对象[8];

示例问题11:程序分析

公共静态int [] [] doWork (int [] [], int [] [] b) {

Int [][] ret = new Int [a.length][a[0].length];

For (int I = 0;我< a.length;我+ +){

For (int j = 0;j <[我]. length;j + +) {

Ret [i][j] = a[i][j] + b[i][j];

返回受潮湿腐烂;

在上面的代码中,在下一行中不会被捕获的潜在错误是什么?

受潮湿腐烂] [j] =一个] [j) +b] [j];

可能的答案:

数组可以包含空值

数组可能会越界

数组一个可以设置为空

数组可能没有初始化

代码写得很好

正确答案:

数组可能会越界

解释

在代码的这一点,它是不可能的一个b是零。此外,这些数组不能包含空值,因为它们是由基本类型(int类型)。它们不能被设置为空,因为它们不是对象。这里的潜在错误有点深奥,但值得注意。这里存在一个可能的错误,即2D数组是“不规则的”;然而,我们不需要为考试担心这个。不过,也有可能数组b(假设它不是空的)与数组的大小不相同一个因为我们在使用一个要设置循环计数,这可能意味着数组溢出b通过使用过大的索引值。(注意,也有可能b可能为null,导致错误;然而,这种可能性是没有答案的。)

←之前 1
大学导师的学习工具