Assertions Question 1
Assertions Question 1
Assertions Question 1
Question 1
Which of the following are command-line switches used to enable assertions in non-
system classes?
a. -ea
b. -ae
c. -aon
d. -aoff
e. -enableassertions
f. -assertionsenable
g. -assertionson
h. -assertionsoff
ANSWER
a -ea Two command-line switches used to enable assertions in
1
e -enableassertions non-system classes are -ea and -enableassertions.
Question 2
Which of the following are command-line switches used to disable assertions in non-
system classes?
a. -da
b. -ad
c. -aon
d. -aoff
e. -disableassertions
f. -assertionsdisable
g. -assertionson
h. -assertionsoff
ANSWER
Two command-line switches used to disable assertions are
a -da
2 -da and -disableassertions. Remember that all of the letters
e -disableassertions
are lower case.
Question 3
Which of the following are command-line switches used to disable assertions in non-
system classes?
a. -disableassertions
b. -disableAssertions
c. -assertionsDisable
d. -assertionsOn
e. -assertionsOff
f. None of the above
ANSWER
Two command-line switches used to disable assertions in non-
3 a -disableassertions system classes are -da and -disableassertions. Remember that
all of the letters are lower case.
Question 4
Which of the following are command-line switches used to enable assertions in system
classes?
a. -saon
b. -saoff
c. -esa
d. -sae
e. -systemassertionson
f. -systemassertionsoff
g. -enablesystemassertions
h. -systemassertionsenable
ANSWER
Two command-line switches used to enable assertions
c -esa
4 in system classes are -esa and -enablesystemassertions.
g -enablesystemassertions
Remember that all of the letters are lower case.
Question 5
Which of the following statements are true?
ANSWER
By default assertions are disabled at run-time. Assertions can be selectively
enabled for any named class. Assertions can be selectively enabled for any
a b
named package. If assertions are selectively enabled for any named package
5d e
then assertions are automatically enabled for the subpackages. Assertions can
f
be selectively enable for the unnamed package in the current working
directory.
Question 6
Which of the following is thrown to indicate that an assertion has failed?
a. AssertError
b. AssertException
c. AssertionError
d. AssertionException
e. None of the above
ANSWER
An AssertionError is thrown to indicate that an
6 c AssertionError assertion has failed. Don't be fooled by the name
AssertionException.
Question 7
class A {
void m1(int i) {
int j = i % 3;
switch (j) {
case 0: System.out.print("0"); break;
case 1: System.out.print("1"); break;
default:
assert j == 2;
System.out.print(j);
}}
public static void main (String[] args) {
A a = new A();
for (int i=5; i >= -1; i--) {a.m1(i);}
}}
ANSWER
With assertions enabled it prints If, under normal operating circumstances,
210210 followed by an the default label of a switch statement
b should not be reached, then an assert
7 AssertionError message. With
e statement can be placed after the default
assertions disabled it prints
label to verify that an unexpected condition
210210-1
has not not occurred.
Question 8
class B {
private static int x1;
public void setX(int x) {x1 = x;}
public int getX() {return x1;}
public static void main(String[] args) {
int i1 = 0, j1 = 0;
do {
System.out.print(j1++);
assert (i1 = j1 + x1) < 6;
} while (i1 < 3);
}}
Assuming that the setX method is never invoked, which statements are true?
Question 9
Which statements are true?
ANSWER
9 a Assertions should not Assertions may be enabled or disabled at run time. Since
d be used to validate assertions are not always enabled, they should not be
arguments passed to used to validate the parameters of public methods.
public methods. Parameter checking is typically published in the API
Assertions should not specification of a method and must be enforced even
be used to perform when assertions are not enabled. Rather than use an
processing that is assertion, an appropriate runtime exception should be
required for the normal thrown such as IllegalArgumentException,
operation of the IndexOutOfBoundsException, or
application. NullPointerException. However, an assertion
may be used to validate the parameters of a nonpublic
method. Since assertions are not always enabled, an
assertion should not be used to perform operations that
are required for the normal operation of the program. For
example, the boolean expression of an assertion should
not be used to produce the side effect of incrementing a
variable that controls a loop statement. If assertions are
disabled then the loop is unlikely to function as intended.
Section 14.20 of the Java Language Specification defines
"unreachable" statements. If an assert statement is
"unreachable" as defined by the JLS, then a compile-
time error is generated. In contrast, a programmer may
believe that some points in the code will not be reached
as a result of design assumptions. For example, a
programmer may believe that the default case of a switch
statement will never be reached. An assertion can be
placed in the default case to verify the behavior of the
switch statement.
Question 10
Which statements are true?
a. Assertions should never be placed at any point in the code that should not be reached
under normal circumstances.
b. The compiler will generate an error if an assert statement is "unreachable" as defined
by the Java Language Specification.
c. A catch clause should not be used to catch an AssertionError.
d. AssertionError is a checked exception.
ANSWER
10 b The compiler will generate an error Section 14.20 of the Java Language
c if an assert statement is Specification defines "unreachable"
"unreachable" as defined by the Java statements. If an assert statement is
Language Specification. A catch "unreachable" as defined by the JLS, then
clause should not be used to catch an a compile-time error is generated. In
AssertionError. contrast, a programmer may believe that
some points in the code will not be
reached as a result of design assumptions.
For example, a programmer may believe
that the default case of a switch statement
will never be reached. An assertion can be
placed in the default case to verify the
behavior of the switch statement. While
the exception handling mechanisms of
Java have been designed to allow for
recovery from Exceptions, the assertion
mechanisms have been designed to
discourage recovery attempts. An
assertion is used to verify that the
program has not strayed beyond the
bounds of expected behavior. For
example, suppose that you go to bed one
night, and your pet dog is sleeping on the
floor next to your bed. Before going to
sleep, you make the assertion that your
dog will still be there in the morning.
When you wake up, you find that a
different dog is sleeping in place of your
pet. How do you recover from the failure
of your assertion? Since you probably did
not expect your dog to be mysteriously
replaced during the night, it is unlikely
that you have already developed an
effective recovery routine. However, if
you had planned for a dog swapping
exception, then the recovery should be
handled by the exception handling
mechanism rather than the assertion
mechanism.
Question 11
class C {
String m1(int i) {
switch (i) {
case 0: return "A";
case 1: return "B";
case 2: return "C";
default: throw new AssertionError();
}}
public static void main(String[] args) {
C c = new C();
for (int i = 0; i < 4; i++) {
System.out.print(c.m1(i));
}}}
ANSWER
11 a With assertions enabled it prints ABC If the default label of a switch
b followed by an AssertionError statement should not be reached under
d message. With assertions disabled it normal operating circumstances, then
prints ABC followed by an the default label might be a good
location for an assert statement. If a
method is declared with a non-void
return type and if no return statement
appears after the switch statement, then
AssertionError message. In this each case of the switch must have a
code example an assert statement return statement or a throw statement.
could not be used in place of the The throw statement is used rather than
"throw" statement. an assert, because the compiler knows
that the assert statement is not
functional when assertions are
disabled.
Question 12
class C {
String m1(int i) {
switch (i) {
case 0: return "A";
case 1: return "B";
case 2: return "C";
default:
assert false;
}
return "E";
}
public static void main(String[] args) {
C c = new C();
for (int i = 0; i < 4; i++) {
System.out.print(c.m1(i));
}}}
ANSWER
With assertions enabled it prints ABC If the default label of a switch statement
should not be reached under normal
a followed by an AssertionError
12 operating circumstances, then the default
d message. With assertions disabled it
label might be a good candidate for the
prints ABCE
use of an assert statement.
Question 13
class C {
String m1(int i) {
switch (i) {
case 0: return "A";
case 1: return "B";
case 2: return "C";
default:
assert false;
}
}
public static void main(String[] args) {
C c = new C();
for (int i = 0; i < 4; i++) {
System.out.print(c.m1(i));
}}}
ANSWER
If the default label of a switch statement should not be
reached under normal operating circumstances, then
the default case becomes a good candidate for the use
In this code example a
of an assert statement. If a method is declared with a
throw statement must
d non-void return type and if no return statement appears
13 be used in place of the
e after the switch statement, then each case of the switch
assert statement.
must have a return statement or a throw statement. The
Compile-time error
throw statement is used rather than an assert, because
the compiler knows that the assert statement is not
functional when assertions are disabled.
Question 14
class D {
private boolean b1, b2;
public void setB1(boolean b) {b1 = b;}
public void setB2(boolean b) {b2 = b;}
public void m1 () {
if (!b2 & !b1) {System.out.print("A");
} else if (!b2 & b1) {System.out.print("B");
} else if (b2 & !b1) {System.out.print("C");
} else {assert false;}
}
public static void main (String[] args) {
D d = new D();
d.setB1(true); d.setB2(true);
d.m1();
}}
ANSWER
With assertions enabled it prints an The assert statement indicates that
AssertionError message. With the programmer believes that b1
a assertions disabled it prints nothing. The and b2 will never be true
14 d assert statement is being used to check a simultaneously, and the assert
f control-flow invariant to verify that the statement should not be reached
control flow never reaches a point in the under normal operating conditions.
program.
Question 15
class A {
private void m1 (int i) {
assert i < 10 : i; System.out.print(i);
}
public void m2 (int i) {
assert i < 10 : i; System.out.print(i);
}
public static void main (String[] args) {
A a = new A(); a.m1(11); a.m2(12);
}}
ANSWER
If assertions are enabled at
run time it prints an error Assertions may be enabled or disabled at run time.
message. With assertions Since assertions are not always enabled, they
disabled it prints 1112. should not be used to validate the parameters of
The assert statements are public methods. Parameter checking is typically
being used to check a published in the API specification of a method and
a
precondition--something must be enforced even when assertions are not
d
15 that must be true when the enabled. Rather than use an assertion, an
f appropriate runtime exception should be thrown
method is invoked.
h
Method m2 is an example such as IllegalArgumentException,
of an improper use of an IndexOutOfBoundsException, or
assert statement: an assert NullPointerException. However, an
statement should not be assertion may be used to validate the parameters of
used for argument checking a nonpublic method.
in a public method.
Question 16
class B {
int a, b, c;
private void setA(int i) {a = i;}
private void setB(int i) {b = i;}
private int m1 (int i) {
c = a + b + i; assert c < 200 : c; return c;
}
public static void main (String[] args) {
B b = new B(); b.setA(50); b.setB(100); b.m1(50);
}}
ANSWER
If assertions are not enabled at run time it prints nothing.
Variable c equals
b With assertions enabled it prints an error message. The
200 when the
16 c assert statement is being used to check a postcondition--
assertion is
e something that must be true when the method completes
checked.
successfully.
Question 17
class C {
int a, b, c;
public void setA(int i) {a = i; assert validateC() : c;}
public void setB(int i) {b = i; assert validateC() : c;}
private boolean validateC() {
return c > a + 2 * b;
}
public int m1(int i) {
c = a + b + i;
assert validateC() : c;
return c;
}
public C(int i) {
c = i; assert validateC() : c;
}
public static void main(String[] args) {
C c = new C(251); c.setA(50); c.setB(100);
}}
ANSWER
If assertions are not enabled at This question is an example of using
run time it prints nothing. With assertions to check a class invariant--
assertions enabled it prints something that must be true about each
b
nothing. The assert statement is instance of the class. Although a class
17 d
being used to check a class invariant must be true before and after the
e
invariant--something that must be execution of each public method, the
true about each instance of the invariant is typically only checked at the end
class. of each method and constructor.
Question 18
class E {
private boolean b1, b2, b3;
public void setB1(boolean b) {b1 = b;}
public void setB2(boolean b) {b2 = b;}
public void setB3(boolean b) {b3 = b;}
public void m1 (int i) {
b2 = i % 2 == 0;
if (!b3 & !b2 & !b1) {System.out.print("A");
} else if (!b3 & !b2 & b1) {System.out.print("B");
} else if (!b3 & b2 & !b1) {System.out.print("C");
} else { // Only b3 is true.
assert b3 & !b2 & !b1;
}
System.out.print(b1 + "," + b2 + "," + b3);
b1 = b2 = b3 = false;
}
public static void main (String[] args) {
E e = new E(); e.setB1(true); e.m1(2);
}}
ANSWER
18 a With assertions enabled it prints an Method m1 has a series of if/else
d error message. With assertions statements. The first if statement is
f disabled it prints: true,true,false The processed if none of the booleans are
h combination of the if/else statements true. The second is processed if only
and the assert statement indicate that b1 is true. The third is processed if
the programmer expects no more than only b2 is true. A set of three booleans
one boolean, b1, b2 or b3, to be true. can exist is eight states. The three if
The assert statement is being used to statements account for three of those
check an internal invariant--something states; so five more states remain. The
that the programmer assumes to be true assert statement indicates that the
at a particular point in the program. programmer assumes that only one of
those five remaining states is valid--
that is the state where only b3 is true.
The combination of the three if
statements and the assert statement
indicate that the programmer believes
that no more than one of the booleans
will be true at that point in the
program. That assumption is called an
internal invariant.
Question 19
class F {
private boolean b1, b2, b3;
public void setB1(boolean b) {b1 = b;}
public void setB2(boolean b) {b2 = b;}
public void setB3(boolean b) {b3 = b;}
public String m1 (int i) {
b2 = i % 2 == 0;
if (!b3 & !b2 & !b1) {return "None are true.";
} else if (!b3 & !b2 & b1) {return "Only b1 is true.";
} else if (!b3 & b2 & !b1) {return "Only b2 is true.";
} else if (b3 & !b2 & !b1) {return "Only b3 is true.";
} else {throw new AssertionError();}
}
public static void main (String[] args) {
F f = new F();
f.setB1(true);
System.out.println(f.m1(5));
System.out.println(f.m1(6));
}}
ANSWER
19 a Prints "Only b1 is true" followed Method m1 has a series of if/else
statements. The first if statement is
processed if none of the booleans are true.
The second is processed if only b1 is true.
The third is processed if only b2 is true. The
fourth is processed if only b3 is true. A set
of three booleans can exist in one of eight
states. The first four if statements account
for four of those states; so four more states
remain. The combination of the three if
statements and the fact that an
AssertionError is thrown from the last
else block indicates that the programmer
believes that no more than one of the
booleans will be true when method m1 is
by an error message. The
being processed. An assumption concerning
combination of the if/else
the state of a set of variables is called an
statements and the assert statement
internal invariant. In this case, however, the
indicate that the programmer
assertion was tested by verifying that
c expects no more than one boolean,
control never reached a particular point in
e b1, b2, or b3, to be true. The assert
the program. Based on the testing
statement is being used to check a
technique, we would say that the assertion
control-flow invariant to verify that
tests a control-flow invariant. A throw
the control flow never reaches a
statement is used in place of an assert
point in the program.
statement, because the throw statement can
not be disabled. As a result, the method is
certain to generate an error once control
passes beyond all of the return statements.
The declared return type of method m1 is
String. No return statement appears after the
sequence of if statements; therefore, every
if statement must either return a String or
throw an exception. Assertions can be
disabled at run time, so an assert statement
in the final if block is no guarantee that an
exception will be thrown. For that reason,
an assert can not replace the throw
statement.
Question 20
An assert statement can be used to check a control-flow invariant to verify which of the
following?
ANSWER
A control-flow invariant is placed at a point in the
program that the programmer assumes will never
be reached. Two examples are the default case of
a switch statement or the else block of an if/else
statement. It makes no sense to use an assert
statement to verify that the flow of control does
The flow of control does not
reach a particular point in the program, because it
reach a particular point in the
is unlikely that an assertion error is helpful when
b program. The default case of
the program is found to be functioning correctly.
20 e a switch statement is not
An assert statement placed at the beginning of a
f reached. The else block of
method is generally used to check a precondition.
an if/else statement is not
An assert statement that is placed at the end of a
reached.
method to check the state of some variables is
generally said to be checking a post condition.
However, it is also possible that an assert
statement placed at the end of a method might
also be checking a control-flow invariant. The
correct term depends on the usage.