All AP Computer Science A Resources
Example Questions
Example Question #1 : Debugging
Consider the following code:
public static class Rectangle {
private double width, height;
public Rectangle(double w,double h) {
width = w;
height = h;
}
public double getArea() {
return width * height;
}
public double getPerimeter() {
return 2 * width + 2 * height;
}
}
public static class Square extends Rectangle {
public Square(double s) {
super(s,s);
}
}
public static void main(String[] args) {
Rectangle[] rects = new Rectangle[6];
for(int i = 0; i < 6; i++) {
if(i % 2 == 0) {
rects[i] = new Rectangle(i+10,i + 20);
} else {
rects[i] = new Square(i+20);
}
}
Square s = rects[1];
}
What is the error in the code above?
You cannot assign a Square
object to an array of Rectangle
objects.
The final assignment operation cannot be done.
You need to use "implements", not "extends" for the class Square
.
There is an array overrun.
There is an error in the declaration of the Rectangle
array.
The final assignment operation cannot be done.
This code fills up the 6 member array with alternating Rectangle and Square objects. You can do this because the Square class is a subclass of Rectangle. That is, since Squares are Rectangles, you can store Square objects in Rectangle variables. However, even though rects[1]
is a square, you CANNOT immediately reassign that to a Square object. The code has now come to consider all of the objects in the array as being Rectangle objects. You would need to explicitly type cast this to get the line to work:
Square s = (Square)(rects[1]);
Example Question #2 : Debugging
What is the error in the following code?
int val1 = -14,val2 = 4;
final int val3 = 9;
double val4 = 4.1;
double val5 = 3.1;
val1 = val2 * val3;
val3 = val1 * 12;
val5 = val1 - val3;
val4 = val2 + val5;
You cannot assign the new integer value to val3
.
You cannot perform mixed addition or subtraction with doubles and integers.
You must define val2
on its own line.
You cannot multiply val3
by val2
.
You cannot assign the result of an integer subtraction to val5
.
You cannot assign the new integer value to val3
.
The only error among the options given is the fact that this code assigns a new value to the variable val3
, which is defined as a constant. (This is indicated by the keyword final
before the rest of its declaration.) You cannot alter constants once they have been declared. Thus, the following line will cause a compile-time error:
val3 = val1 * 12;
Example Question #3 : Debugging
public static void main(String[] args) {
int[] x = {3,4,4,5,17,4,3,1};
int[] y = remove(x,4);
for(int i = 0; i < y.length; i++) {
System.out.print(y[i] + " ");
}
}
public static boolean remove(int[] arr, int val) {
boolean found = false;
int i;
for(i = 0; i < arr.length && !found; i++) {
if(arr[i] == val) {
found = true;
}
}
if(found) {
for(int j = i; j < arr.length;j++) {
arr[j - 1] = arr[j];
}
arr[arr.length - 1] = 0;
}
return found;
}
What is the error in the code above?
In the remove
method, there is a variable that has not been initialized before being used
There are multiple options to delete, which is not supported by the function
The output loop in main
will overrun the array y
There is no error in the code
There is a type mismatch in one of the assignments
There is a type mismatch in one of the assignments
The problematic line is this one:
int[] y = remove(x,4);
Notice that the variable y is defined as an array. Now, it is tempting to think (without looking too closely) that the remove
method returns the array after the removal has been accomplished; however, this is not how the logic works in the remove
method. Instead, it returns a boolean indicating whether or not this removal was successful or not (i.e. it tells you whether or not it actually found the value). Therefore, you cannot make an assignment like the one above, for the two types are not the same. That is, y
is an integer array, while remove
returns a boolean value!
Example Question #7 : Program Analysis
public interface ServerInstance {
byte[] readBytes();
boolean writeBytes(byte[]b);
boolean wake();
boolean status();
void sleep();
}
public class MyHost implements ServerInstance {
boolean running = false;
public boolean wake() {
// Other logic code here...
return running;
}
public boolean status() {
// Other logic code here...
return running;
}
public byte[] readBytes() {
byte[] buffer = null;
// Other logic code here...
return buffer;
}
public void sleep() {
// Other logic code here...
running = false;
}
public byte[] writeBytes(byte[] b) {
// Other logic code here...
return b;
}
// Other methods...
}
What is the error in the code above?
The word extends
should be used, not implements
There is no error
The writeBytes
method is not properly defined
The sleep
method does not return anything
The readBytes
method initializes the variable buffer
to null
The writeBytes
method is not properly defined
When you implement an interface, all of the methods defined in that interface must be written in the class that is proposing to be such an implementation. (Or, if they are not implemented there, you need to involve abstract classes—but that is not our concern here.) The methods must match the prototypes proposed in the interface. In the example code, ServerInstance
has a method writeBytes
that returns a boolean value. However, the MyHost
class has implemented this method as returning a byte[]
value. Since you cannot have different types of return values for methods with the same parameter set, Java interprets this as being the proposed implementation for writeBytes(byte[] b)
, and this method must return a boolean if MyHost
is to implement ServerInstance
.
Example Question #2 : Debugging
public static void foo() {
int x = 10; y = 21, z = 30;
int[] arr = null;
for(int i = 0; i < y; i+= 4) {
arr = new int[i / 5];
}
for(int i = 0; i < x; i++) {
arr[i] = z / i;
}
for(int i = 0; i < z; i++) {
arr[i] = z * i;
}
}
Which of the following lines of code will cause a compile-time
error?
arr[i] = z * i;
arr[i] = z / i;
None of these lines will cause a compile-time
error
arr = new int[i / 5];
int x = 10; y = 21, z = 30;
int x = 10; y = 21, z = 30;
An error in compilation occurs before any code even attempts to execute. Thus, it is primarily a syntactical error in the code. In the selection above, the line
int x = 10; y = 21, z = 30;
has a semicolon right after 10.
This causes an error in the code directly following on this, for the code
y = 21, z = 30;
is not valid Java code.
There are other errors in this code. arr[i] = z / i;
will cause a divide by 0 error when i is 0. Also, arr[i] = z * i;
will overrun the bounds of the array arr
. However, these are not compile-time errors—i.e. errors that occur before the code is even able to run!