Changes added October 6, 2002.

Page 22, Table 2.1 Keywords in Java

Page 43, Casting

"Casting the reference literal null, which is not of any type,
to a reference type results in a compile time warning."

and should be replaced by:

"The reference literal null can be cast to any reference
type."

Page 120, Review Question 4.17

Replace the choices with the following:

(a) Member variable i is accessible in all classes in other packages.
(b) Member variable j is accessible in all classes in other packages.
(c) Member variable k is accessible in all classes in other packages.
(d) Member variable k is accessible in subclasses only in other packages.
(e) Member variable l is accessible in all classes in other packages.
(f) Member variable l is accessible in subclasses only in other packages.

Page 123, final Members

In the middle of the page, replace the line beginning with:

" setKWH from the superclass ... "

with:

" setWatts() from the superclass ... "

Page 186, Review Question 6.5

Change choice (e)

(e) The overriding method can have a different return value than the
overridden method.

to (replace "value" with "type"):

(e) The overriding method can have a different return type than the
overridden method.

Page 235, Example 7.6 Inheritance and Containment Hierarchy

With line (2) uncommented, the compiler distributed with J2SE 1.4 compiles
the code without error. However, this is a recent change to the Sun compiler. We
cannot see that the Java Language Specification (JLS) has been changed to allow
such disambiguation, and other standards compliant compilers such as IBM's Jikes
still reject the code. We don't know whether this is a case of misinterpreting
the JLS, or a bug in the Sun Java compiler distributed with J2SE 1.4.

Changes added December 22,
2001.

Page 3, Declaring Members: Variables and Methods

"It also has a special method that has the same name as the class. Such
methods are called constructors, ..."

with:

"It also has a special method-like declaration that has the same name as
the class, (2). Such declarations are called constructors, ..."

Page 7, Section 1.5 Static Members

In the middle of the page,
replace the sentence:

"Static members are distinguished from instance variables in a class
definition by the keyword static in their declaration."

with:

"Static members are distinguished from instance members in a class
definition by the keyword static in their declaration."

Page 24, Table 2.6 Examples of Octal and Hexadecimal Literals in Java

Replace the last row of the table:

-2147483648

-017777777777

-0x7fffffff

with:

-2147483648

-020000000000

-0x80000000

Page 48, Numeric Type Conversions on Assignment

The following paragraph is not correct any more:

"Narrowing conversions between char and byte (or short) values on
assignment always require an explicit cast, even if the value is in the range of
the destination datatype."

The new rules state that a narrowing primitive conversion is valid if the
following conditions are fulfilled:

1. The right-hand side expression (i.e. source) is a constant expression
of type byte,short, char or int.
2. The type of the left-hand variable (i.e. destination) is byte,short,
or char.
3. The value of the constant expression is in the range of
the destination datatype.

Page 137, switch Statement

Replace the following sentence in the lower half of the page:

"The value LITTLE_ADVICE results in only one advice at (5) being given."

with:

"The value LITTLE_ADVICE results in only one advice at (4) being given."

Page 228, Figure 7.1 Top-level Nested Classes and Interfaces

To make the figure consistent with Example 7.2, do the following:

In the figure, add public accessibility, '+', to the class
AccessInTopLevelClass.

In the figure, remove public accessibility, '+', from the interface
NestedTopLevelInterface1.

Page 313, Searching for Characters and Substrings

On top of the page,
replace the line:

String replace(char old, char new)

with:

String replace(char oldChar, char newChar)

Page 447, Review Question 14.18

Replace the question:

"What would be the effect of calling enableEvent(AWTEvent.KEY_EVENT_MASK)
on a component?"

with:

"What would be the effect of calling enableEvents(AWTEvent.KEY_EVENT_MASK)
on a component?"

Page 556, Section 18.3 Byte Streams: Input Streams and Output Streams

In the middle of the page,
replace the sentence:

"Note that the first read() method read a byte, but returns
an int
value."

with:

"Note that the first read() method reads a byte, but returns
an int
value."

Page 558, Searching for Characters and Substrings

In the lower half of the page,
replace the line:

FileOutputStream(File file) throws IOException

with:

FileOutputStream(File file) throws FileNotFoundException

Changes added June 29, 2001.

Page ix, Book web sites

Replace the following:

Information about the JDK and its documentation can be found at the following
web site:

<URL:http://java.sun.com/products/jdk/1.2/>

with:

Information about the Java 2 SDK Standard Edition (referred to as JDK in the
book) and its documentation can be found at the following web site:

<URL:http://java.sun.com/j2se/>

Page 40, Programming Exercise 2.1

A short note on creating and using packages.

A package statement can only occur as the first statement in a Java
source file.
The statement

package com.acme;

instructs the compiler to place the Java byte code for all the classes (and
interface) specified in the source file in the package com.acme.

Think of a package name as a path in the file system.
In this case the package name com.acme corresponds to the path name com/acme.
So the Java byte code for all the classes (and interface) specified in the
source file Exercise1.java will be placed under the catalog com/acme.

Question: where is com/acme?
You can choose the location of com/acme by using the -d option
(d for destination) when compiling with javac. Assume that the
current directory is called work, and the source code file Exercise1.java
is to be found here. The command

javac -d . Exercise1.java

(note the dot after the -d option to indicate the current directory)
will create com/acme under the current directory, and place the Java
byte code for all the classes (and interface) in it.

How do we run the program? Since the current directory is work and
we want to run Exercise1.class, the *full name* of the Exercise1
class must be specified in the java command:

java com.acme.Exercise1

This will now result in the main() method from the com.acme.Exercise1
class being executed.

Page 43, Casting

Replace the sentence in the lower part of the page:

"The same applies to the reference literal null, which is not
of any type and therefore cannot be cast to any type."

with:

"Casting the reference literal null, which is not of any type,
to a reference type results in a compile time warning."

Page 48, Numeric Type Conversions on Assignment

Replace the following line at the top of the page:

float fast = (float) 100.5D; // Narrowing: double to
float.

with (gives a better example of truncating):

float fast = (float) 300.5D; // Narrowing: double to
float.

Page 68, Examples of Bitwise Extended Assignment

Replace the line:

"At (1) in the examples above, both the byte value in v1
and the char value in v2 are first promoted to int."

with:

"At (1) in the examples above, both the char value in v1
and the byte value in v2 are first promoted to int."

Page 68, Shift Operators: <<, >>, >>>

Replace the sentences:

"The number of bits shifted is always in the range modulus 32 for an int
value, and in the range modulus 64 for a long value."

with:

"The shift distance is calculated as the value of the expression (right
operand value & (size-1)), where size is either 32 or 64 depending on
whether the promoted type of the left operand is int
or long. Thus the shift distance is always in the range 0 to 31 when
the promoted type of left operand is int, and in the
range 0 to 63 when the promoted type of left operand is long."

Page 70, The Shift-right-with-sign-fill Operator >>

Replace the following line in the middle of the page:

= 0xfffffffa

with:

= 0xfffffffd

Page 71, Shift Extended Assignment Operators: <<=, >>=,
>>>=

Replace the following line in the middle of the page:

= 0xc0

with:

= 0x80

Page 88, Declaring Array Variables

At the top of the page, replace the following:

"..., and therefore does not apply to local arrays as well (Section 2.9,
p. 34)."

with:

"..., and therefore does not apply to local array variables as well
(Section 2.9, p. 34)."

Page 92, Figure 4.1 Arrays of Arrays

Extra horizontal line in the class diagram for matrix:double[][]
should be deleted.

Page 163, throws Clause

The last sentence of this page:

"The method definition in the subclass can only specify all or none, or
a subset of the exception classes (including their subclasses) specified in the throws
clause of the overridden method in the superclass."

should be replaced with (insert checked ):

"The method definition in the subclass can only specify all or none, or
a subset of the checked exception classes (including their subclasses)
specified in the throws clause of the overridden method in the
superclass."

Page 181, Variable Shadowing

In the last sentence of this section, replace the following:

"...: the variable accessed is from the class corresponding to the
reference type, ..."

with:

"...: the variable accessed is declared in the class corresponding to
the reference type, ..."

Page 254, Finalizer Chaining

In the last line, replace "massage" with "message". :-)

Page 255, Invoking Garbage Collection

Replace the sentence:

"The System.gc() method can be used to force garbage
collection, and the System.run Finalization() method can be used to run
the finalizers (which have not been executed before) for objects eligible for
garbage collection."

with:

"The System.gc() method can be used to request garbage
collection, and the System.run Finalization() method can be called to
suggest that the finalizers (which have not been executed before) for objects
eligible for garbage collection be run."

Page 284, Thread States

In the line that starts "Dead state: ...", replace
"Runnable" with "Running".

Page 369, List

Delete the following lines:

void select(String str)

Selects the item that matches the argument string in the
list.

Page 453, Figure 15.1 Coordinates of a Component

Replace the following in the figure:

(top, left)

with:

(left, top)

Page 454, The Graphics Class

Replace the following sentence in the middle of the page:

"The origin of the drawing region in a component is given by (getInsets().top,
getInsets().left)."

with:

"The origin of the drawing region in a component is given by (getInsets().left,
getInsets().top)."

Page 552, Querying the File System

"Also platform-dependent, the canonical path usually specifies a
pathname in which all relative references have been completely resolved."

with (insert "absolute"):

"Also platform-dependent, the canonical path usually specifies an
absolute pathname in which all relative references have been completely
resolved."

Page 558, Table 18.2 Output Streams

Add a horizontal line between DataOutputStream and ObjectOutputStream.

Page 579, Terminal I/O

In the upper half of the page, replace the sentence:

"The PrintStream class is now mostly deprecated, but its print()
methods, which act as corresponding print() methods from the PrintWriter
class, can still be used to write output to System.out and System.err."

with:

"The PrintStream class offers print() methods which
act as corresponding print() methods from the PrintWriter
class. These methods can be used to write output to System.out and System.err."

Page 625, Answer to Review Question 2.11

Additional explanation:

Strict adherence to the Java language specification requires the following
declaration to start the execution of a Java program:

public static void main(String[] args)

This does not rule out any other legal non-accessibility modifiers like final.
The Java compiler is however taking liberties with the specification allowing
other declarations for starting the execution of a Java program.

Page 637, Answer to Review Question 6.2

See "Clarification on Inheritance of Superclass Members".

Page 641, Answer to Review Question 6.27

Replace the line:

"... , but rather uses the public interface."

with:

"... , but rather uses the public method describe() in class Star
to do that."

Page 662, Answer to Review Question 18.2

Replace the answer with:

18.2(b)

The separator constant is of type String and contains the character
used as path separator on the native platform. The most common platforms only
use a single character as a path separator.

Page 699, Q2

The value returned by >>> will never be negative as long as
the value of the right operand is not divisible by 32.

should be replaced with:

The value returned by >>> will never be negative as long as
the value of the right operand is not divisible by 32, and the left operand is
non-negative.

Page 725, Answer to Q29

Replace the answer with:

Q29(b), (c) and (e)

Unlike local variables, all member variables are initialized with default
initial values. All numeric variables are initialized to zero, boolean
values to false, char values to '\u0000' and all
object reference values to null. (c) occurs when an un-initialized
member variable is used in an initializer block before its declaration.

Changes added December 22, 2000.

Page 70, The Shift-right-with-sign-fill Operator >>

Replace the line:

"The value for i is shifted right with sign-fill 4 places:"

with (replace 4 with 2):

"The value for i is shifted right with sign-fill 2 places:"

Page 129, Review Question 4.25

Replace choice (d) with (delete the words "The constructor"):

(d) MyClass() cannot be declared final.

Page 200, Review Question 6.13

Replace the question:

"Given the following variable declaration within the definition of an
interface, which of these declarations are equivalent to it?"

with:

"Given the following variable declaration within the definition of an
interface, which of these declarations can be substituted for it?"

Page 230, Example 7.3 Defining Non-static Inner Classes

Replace the code line:

private static String msg = "Shine the inner light.";
// (2)

with (delete the word static):

private String msg = "Shine the inner light.";
// (2)

Page 399, Review Question 13.11

Replace the question:

"Which of these are methods in the CardLayout class?"

with:

"Which of these method names are in the CardLayout class?"

Page 527, JTree

Replace the first sentence of the last paragraph:

"A JTree uses an object implementing the TreeCellRenderer interface to
render cells in each column of the table."

with:

"A JTree uses an object implementing the TreeCellRenderer interface to
render the elements in the tree structure."

Page 632, Answer to Review Question 4.25

Replace the sentence:

"Only methods can be declared synchronized."

with:

"Only methods and code blocks can be synchronized."

Page 716, Q49

Replace the question:

"Which modifiers and return types would be valid in the declaration of a
working main() method for a Java standalone application?"

with:

"Which modifiers and return types would be valid in the declaration of a main() method
which starts the execution of a Java standalone application?"

Changes added October 13, 2000.

Page 20, Exam Objectives

The last bullet (and its sub-bullet) should be deleted:

Write code to implement listener classes and methods, and in listener
methods extract information from the event to determine the affected
component, mouse position, nature and time of the event. State the event
class name for any specified event listener interface in the java.awt.event
package.

See Chapter 14.

Page 39, Review Question 2.11

The question:

"Which of these are valid declarations of the main() method?"

should read:

"Which of these are valid declarations of the main() method in order to
start the execution of a Java program?"

Page 106, Packages

Second paragraph, in the sentence:

"Subpackages do not afford anything extra when it come to accessibility
of the members."

replace "come" with "comes":

"Subpackages do not afford anything extra when it comes to accessibility
of the members."

Page 136, switch Statement

The sentence:

"The <statementi> associated with the first case label that is equal to
the value of the integral expression is executed."

should be changed to (delete "first"):

"The <statementi> associated with the case label that is equal to
the value of the integral expression is executed."

Page 149, return Statement

The sentence:

"The first form of the return statement can also be used in constructors
and initializers, as these also do not return a value."

should be changed to:

"The first form of the return statement can also be used in constructors
as these also do not return a value."

Page 179, Method Overriding

Change the bullet :

The new method definition in the subclass can
only specify all or a subset of the exception classes (including
their subclasses) specified in the throws clause of the overridden
method in the superclass (Section 5.8, p.162).

to
(i.e. insert "or none,"):

The new method definition in the subclass can
only specify all or none, or a subset of the exception classes (including
their subclasses) specified in the throws clause of the overridden
method in the superclass (Section 5.8, p.162).

Page 240, Access Rules for Local Classes

Replace these 2 lines of code:

double zz = A.this.z;
...
double yy = A.this.y;

with

double zz = TopLevelA.this.z;
...
double yy = TopLevelA.this.y;

Page 305, Pseudo Random Number Generator

The sentence:

"The method random() returns a random number greater or equal to
0.0 and less than 1.0, where the value is selected randomly
with the range according to a uniform distribution."

should be (change "with" to "from"):

"The method random() returns a random number greater or equal to
0.0 and less than 1.0, where the value is selected randomly
from the range according to a uniform distribution."

Describe the permanent effects on the file system of constructing and
using FileInputStream, FileOutputStream, and RandomAccessFile objects.

Supplementary Objectives

Distinguish between byte and character streams, and identify the roots
of their inheritance hierarchies.

Write code that uses the classes DataOutputStream and DataInputStream
for writing and reading Java primitive values.

Write code to set up (buffered) readers and writers for text files.

Write code that uses the classes ObjectOutputStream and ObjectInputStream
for writing and reading objects.

Page 552, Querying the File System

In the 2nd paragraph, at the end of last sentence, replace the text:

"... and "c:\documents\book\chapter1", respectively."

with (delete the text "\documents"):

"... and "c:\book\chapter1", respectively."

Page 594, Section 9.1 Javadoc Facility

Replace the bullet:

Class and interface definitions.

with:

Class definitions and interface declarations.

Page 613, Forms of answers expected

In the 4th. paragraph of this section, replace the first sentence:

"For multiple choice questions, the program will present a list of
answers with either radio buttons or checkboxes."

with:

"For multiple choice questions, the program will ask the candidate to
select a specific number of answers from a list."

Page 616, Appendix B Objectives for the SCPJ2 Exam

Replace the URL

<URL:http://suned.sun.com/usa/cert_test.html?content=scpj2_obj>

with the following:

<URL:http://suned.sun.com/USA/certification/progobj.html#Java2>

Page 618, Section TitleLanguage Fundamentals (Chapter 2)

The last objective should be deleted and inserted on page 621 (see below).

Write code to implement listener classes and
methods, and in listener methods, extract information from the event to
determine the affected component, mouse position, nature, and time of the
event. State the event classname for any specified event listener interface
in the java.awt.event package.

Page 621, Section Title The java.awt package (Chapter 13)

The objective deleted from page 618 should be added to the objectives for this
section:

Write code to implement listener classes and
methods, and in listener methods, extract information from the event to
determine the affected component, mouse position, nature, and time of the
event. State the event classname for any specified event listener interface
in the java.awt.event package.

Page 622, Section Title The java.io package (Chapter 18)

Add the following study notes after the objectives (see previous corrections
for this page):

Study notes

Navigation in the file system is done using the File
class. The concept of a stream is central to dealing with input and
output. Input and output streams are provided for reading and writing bytes and
characters. Classes FileInputStream and FileOutputStream
are streams for dealing with the file content. Class RandomAccessFile
allows direct access to the file content as opposed to sequential access
provided by FileInputStream and FileOutputStream.
Readers and writer are provided for reading from and writing characters to
streams. Classes InputStreamReader and OutputStreamWriter
can be used to specify a character encoding when reading from and writing
characters to a stream. Streams can be chained to filters (subclasses of FilterInputStream
and FilterOutputStream) to provide
additional functionality (for example buffering of data, reading and writing
Java primitive values).

Page 646, Review Question 9.6

The sentence:

"For each invocation of check(), each variable pair is incremented and
their values are always equal when the method returns."

should be changed to

"For each invocation of doit(), each variable pair is incremented and
their values are always equal when the method returns."

Page 727, Q51

The sentence:

"Mouse-motion listeners can be registered on all objects that are
instances of Container."

should be changed to:

"Mouse-motion listeners can be registered on all objects that are
instances of Component."

Changes added September 22, 2000.

Page 7, Figure 1.4 Class Diagram showing Static Members of a Class

The method name:

getCounter()

should be replaced by:

getInstanceCount()

Page 10, Example 1.3 Defining a Subclass

Replace the code line:

for (int i = 0; i < stackArray.length; i++)

with:

for (int i = 0; i <= topOfStack; i++)

Page 73, Review Question 3.14

The question:

"Given a variable x of type int (which may contain a negative value), which are correct ways of doubling the value of x?"

should be rephrased:

"Given a variable x of type int (which may contain a negative value), which are correct ways of doubling the value of x, barring any overflow?"

Page 95, Review Question 4.5

In choice (b), replace:

IndexArrayOutOfBoundsException

with:

ArrayIndexOutOfBoundsException

Page 111, Review Question 4.15

Replace the code line:

abstract void haunt()

with
(semi-colon missing):

abstract void haunt();

Page 117, protected Members

Replace the code line:

objRefA.superclassVarA;
// (4) Not OK.

with:

objRefA.superclassVarA = 10;
// (4) Not OK.

Page 163, Section 5.8 throws Clause

Change the last sentence on the page:

"The method definition in the subclass can only specify all or a subset of the exception classes (including their subclasses) specified in the throws clause of the overridden method in the superclass."

to
(i.e. insert "or none,"):

"The method definition in the subclass can only specify all or none, or a subset of the exception classes (including their subclasses) specified in the throws clause of the overridden method in the superclass."

Page 165, Review Question 5.16

In choice (c), replace:

IndexOutOfBoundsException

with:

ArrayIndexOutOfBoundsException

Page 622, Appendix B Objectives for the SCPJ2 Exam

Add the following exam objectives which are covered in Chapter 18:

Section Title: The java.io package (Chapter 18)

Write code that uses objects of the file class to navigate a file system.

Write code that uses objects of the classes InputStreamReader and OutputStreamWriter to translate between Unicode and either platform
default or ISO 8859-1 character encodings.

Destinguish between conditions under which platform default encoding conversion should be used and conditions under which a specific
conversion should be used.

Select valid constructor arguments for FilterInputStream and FilterOutputStream subclasses from a list of classes in the java.io.package.

Page 552, Querying the File System <== THIS CORRECTION SHOULD NOT BE
MADE.

In the 2nd paragraph, at the end of last sentence, replace the text:

"... and "c:\book\chapter1", respectively."

with (insert the text "\documents"):

"... and "c:\documents\book\chapter1", respectively."

Page 604, Review Question 19.3

Replace the code line

/*

with (missing one *):

/**

Page 641, Answer to Review Question 6.25

Replace the last word "overloaded" by "overridden".

Page 673 - 674, Answers to Programming Exercise 6.1 and 6.2

Replace all 7 occurrences of evaulate with evaluate.

Page 674 - 675, Answer to Programming Exercise 7.1

Replace all 8 occurrences of evaulate with evaluate.

The Mock Exam Engine

The on-line exam is missing the underscore in choice a) of question 41,
page 714, in the book. It says "class" instead of "_class".

Changes added August 16, 2000.

Clarification on Inheritance of Superclass Members

On page 118 (subsection private Members) and on page 173 (section 6.1 Inheritance),
it is stated that ALL members of a superclass are inherited by the subclasses.
Accessibility modifiers can be used to control whether the inherited members
are accessible in the subclasses or not.

The Java Language Specification (JLS) states in section 8.2 that
"Members of a class that are declared private are not inherited by
subclasses of that class. Only members of a class that are declared protected
or public are inherited by subclasses declared in a package other than
the one in which the class is declared.
Constructors, static initializers, and instance initializers are not
members and therefore are not inherited."

According to this view, inheritance is linked to DIRECT ACCESSIBILITY
of superclass members. In this sense the private members of the superclass
are NOT inherited by the subclasses, but these members do EXIST in a subclass
OBJECT. Private members of the superclass may be indirectly accessible
from a subclass object if the superclass provides the appropriate implementation.
In the example below, the private variable
i in superclass A
exists in object b of subclass B, but this data member
is not inherited by the subclass B.

"A class inherits from its direct superclass and direct superinterfaces
all the non-private methods (whether abstract or not) of the superclass and
superinterfaces that are accessible to code in the class and are neither
overridden (§8.4.6.1) nor hidden (§8.4.6.2) by a declaration in the
class."

We will make the appropriate changes in accordance with JLS in the next
edition when the time comes.

Page 68, Shift Operators: <<, >>, >>>

In the last sentence at the bottom of the page:

"Since char, byte and short operands are
promoted to either int or long, the result of applying
these bitwise operators is always either an int or a long
value."

Remove the first occurrence of "either" and "or long" so that
the sentence reads:

"Since char, byte and short operands are
promoted to int, the result of applying these bitwise operators
is always either an int or a long value."

Page 490, HTML APPLET Element

[NAME= the name assigned to the applet for identification by other
applets on this HTML page]

In the syntax of the APPLET element:

<APPLET... [ALT = ...][<PARAM NAME ... > ]>[<PARAM NAME ... > ]...

should be:

<APPLET... [ALT = ...]>[<PARAM NAME ... > ][<PARAM NAME ... > ]...

Page 491, HTML OBJECT Element

In the syntax of the OBJECT element:

[NAME= names of other applets on this HTML page ]

should read

[NAME= the name assigned to the applet for identification by other
applets on this HTML page]

Page 568, Section 18.4 Character Streams: Readers and Writers

The paragraph:

"Note that the read() methods read an int in
the range 0 to 65535 (0x0000–0xFFFF), i.e. a Unicode character. The value
–1 is returned if the end of file has been reached."

should read:

"Note that the read() methods read Unicode characters
which are int values in the range 0 to 65535 (0x0000–0xFFFF).
The first method returns the character read as an int. The last
two methods return the number of characters read into the char
array. The value –1 is returned by all methods if the end of file has been
reached."

Page 602, Section 19.3 Running javadoc

The sentence

"One way to generate documentation for one or more classes is to issue
the javadoc command directory containing the source files."

should read

"One way to generate documentation for one or more classes is to issue
the javadoc command in the directory containing the source files."

Page 672, Solution to Programming Exercise 5.2

The four occurrences of the method name needAdjust should be replaced
with needAdjustment.

Page 718, Sample Exam Question 53

The three occurrences of the class name Extention should be replaced
with Extension in the code.

Page 725 Answer to Sample Exam Question 28

The existing answer should also include (b):
Q 28 (b), (c) and (e)

and the following sentence should be added:

"Since a Foo has a Baz which has a Bar, a
Foo
has a Bar."

Other non-essential changes

Chapter 5 Flow Control and Exception Handling

Replace all mentions of "state diagram" with the more accurate term "activity
diagram".