例子问题
例子问题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= 21,z= 30;
这些线都不会引起a编译时
错误
加勒比海盗=新int[我/ 5];
intx= 10;y= 21,z= 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,导致错误;然而,这种可能性是没有答案的。)