Head First Java

Errata for Head First Java

Submit your own errata for this product. Have a question? Try the forums at JavaRanch first.


The errata list is a list of errors and their corrections that were found after the product was released.

The following errata were submitted by our customers and have not yet been approved or disproved by the author or editor. They solely represent the opinion of the customer.


Color Key: Serious Technical Mistake Minor Technical Mistake Language or formatting error Typo Question Note Update



Version Location Description Submitted By Date Submitted
PDF Page xxiv
Second paragraph

First graphic covers a portion of the text.

Anonymous  Jan 28, 2016 
Printed Page 2
Image, item 2

Item 2 reads: "The compiler check for errors and won't let you compile..." It should read "The compiler check for SYNTAX errors and won't let you compile".

Juan Carlos  Nov 09, 2016 
PDF Page 6
Right column text

Text is not vertically centered in the cell: print out “Dog: Fido” (the value of ‘name’ is “Fido”) at the command-line

Anonymous  Jan 28, 2016 
PDF Page 8
Top, Middle Left, Middle Right

This is in the Sharpen Your Pencil answers PDF and there may be more, but here is one example from page #8: "Page 165" should be "Page 169" "Page 172" should be "Page 176" "Page 175" should be "Page 179"

Anonymous  Dec 20, 2009 
Printed Page 8-9

On page 8, it says "at least one main method", which I think it should be "exactly one main method". On page 9, it says "running a program means telling the JVM to <<Load the MyFirstApp class [...] >>", that could be "running THE program", instead, because it can be confusing for a beginner.

Anonymous  Aug 06, 2017 
PDF Page 10
Last code snippet, line 6

Bitwise AND operator & used instead of logical AND &&: if ((x < 3) & (name.equals(Dirk))) {

Anonymous  Nov 22, 2011 
PDF Page 14
Last paragraph

Extra space before comma: See if you can spot the flaw , and fix it.

Anonymous  Jan 28, 2016 
PDF Page 24

The puzzle has an alternative correct answer (code). In my opinion the way I did it felt more natural as the words "a noise", "annoys", "an oyster" flowed more naturally in seequence within the code itself and looked more clear. Like if other person would read my code he would be able to follow it more easy. Just my opinion. class PoolPuzzleOne{ public static void main(String[] arges){ int x = 0; while(x < 4){ System.out.print("a"); if(x < 1){ System.out.print(" "); } System.out.print("n"); if(x < 1){ System.out.print("oise"); x =x -1; } if (x==1){ System.out.print("noys"); } if(x > 1){ System.out.print(" oyster"); } System.out.println(""); x = x + 2; } } }

Rain Tuur  Sep 27, 2016 
PDF Page 78
Last answer

Redundant word: In this case, you’re calling the method for the work it does inside the method, rather than for what the method gives returns. Possible correction: In this case, you’re calling the method for the work it does inside the method, rather than for what the method returns.

Anonymous  Jan 30, 2016 
Printed Page 106
United States

P. 106 Output box in the lower right corner says "hit" followed by "passed" but the string "passed" appears no where in the code on p 106 and does not appear in the compiled output.

IBurbey  Feb 03, 2014 
Printed Page 110
Code example

Code as written does not compile. It needs the class declaration such as: public class SimpleDotComGame { along with the closing brace at the end of the example.

Anonymous  Aug 30, 2011 
PDF Page 140||152
pic of grid || placeDotCom()

Chapter 6. Symbols of rows and columns are mixed up. See the picture on p.140 (virtual grid 7x7) and the code of method placeDotCom(): row = (int) (coords[x] / gridLength); // get row value column = coords[x] % gridLength; // get numeric column value temp = String.valueOf(alphabet.charAt(column)); // convert to alpha

shark_ua  Apr 27, 2015 
ePub Page 145
Prep Code for method checkUserGuess()

The line which says REPEAT with each of the DotObjects in the dotComsList array should be . . . REPEAT with each of the DotCom objects in the dotComsList array The objects are DotCom objects, not DotObjects

Anonymous  Aug 24, 2012 
Printed Page 149
9th line of checkUserGuess method

Line reads: dotComsList.remove(dotComToTest); dotComToTest is not declared anywhere. I imagine this is an error introduced from the fix of a previous errara. Line should read: dotComsList.remove(userGuess); Note from the Author or Editor: 9th line of code that reads: dotComsList.remove(dotComToTest); should be: dotComsList.remove(userGuess);

Anonymous  Oct 05, 2011 
Printed Page 149
4th line, starting with "for(int x = 0;..."

The for loop on page 149 should match the corresponding for loop on page 147, shouldn't it? Are both versions of this loop valid?

Anonymous  Jun 30, 2017 
Printed Page 153
Code Line 6

The GameHelper code, belonging to the Dotcom exercises one can find in the printed version and in the example code of the page has a bug. The code is not able to place a dotcom in the first line horizontally. This: if ( x>0 & (location % gridLength == 0)) Should be: if (incr == 1 & x>0 & (location % gridLength == 0))

Florian Tönjes  Feb 10, 2013 
Printed Page 153
placeDotCom function

There are 2 errors in the function: (starting from the beginning of Pg 153) 1. coords[x++] = location; 2. location += incr; 3. if (location >= gridSize) { 4. success = false; 5. } 6. if (x > 0 && (location % gridLength == 0 ) ) { 7. success = false; 8. } .... error 1: Line 6, the x > 0 will always be true since x is incremented on Line 1. error 2: should move Line 2 to the end of code section. For example, DotCom Locations of 4, 5, 6 will never be generated because in the iteration where location is 6, it is increased to 7 on Line 2 (assume horizontal), and success will be false on Line 3.

Yanzhuo Wang  Apr 17, 2015 
PDF Page 153
placeDotCom()

Algorithmic error: placeDotCom() can"t place vertical "DotComs" in first column. ------------------------------------------------------------------------------------ if (x>0 && (location % gridLength == 0)) must be changed to: if(incr == 1 && (location % gridLength ==0))

shark_ua  Apr 27, 2015 
PDF Page 153
placeDotCom(int comSize)

Original code: while (success && x < comSize) { if (grid[location] == 0) { coords[x++] = location; location += incr; if (location >= gridSize) { success = false; } if (x > 0 && (location % gridLength == 0)) { success = false; } ... } Original code does not allow to place a dotCom in the first line horizontally and vertically when location is in E row. For example, when location is 46: coord[0] = 46; location = 47; success = true; coord[1] = 47; location = 48; success = true; coord[2] = 48; location = 49; success = false ! So dotCom cannot be placed in E46, E47, E48 and it is a mistake. if (incr == 1 && (location % gridLength ==0)) does not solve the problem. Should be: while (success && x < comSize) { if (grid[location] == 0) { coords[x++] = location; if (location >= gridSize) { success = false; } if (incr == 1 && (((location + 1) % gridLength == 0) && ((x - 1) != 2))) { success = false; } location += incr; ... }

Artyom Shootov  Dec 12, 2015 
PDF Page 153
placeDotCom(int comSize)

Small addition to my last correction: Original code: private int[] grid = new int[gridSize]; Should be: private int[] grid = new int[100]; Grid array contains of 0 (if a field is empty) and 1 (if part of dotCom is placed in a field), so it is not a mistake that size of the array is not 49. With this correction dotComs can be placed everywhere.

Artyom Shootov  Dec 12, 2015 
Printed Page 189
3rd quesion.....last paragraph in the answer....

In page num 189,there is an error in the answer for the 3rd question. The answer given is"The third issue is that if a class has only private constructors,it can't be subclassed"... If a class has only private constructors,we can't instantiate that class,but we can extend that class...so,please verify...

Anonymous  Jun 20, 2011 
Printed Page 198
Hippo-Class

The class Hippo can't be a concrete class because the method roam() has to be overwritten.

Anonymous  Sep 03, 2011 
Printed Page 270
Popular Objects solution

End of arrow should point to ba[x].hunny = honeyPot instead of ... new Bear(); last two arrows have to be a line deeper.

Anonymous  Sep 05, 2011 
Printed Page 270

The exercise in page 267 asks you to find the number of active reference to the most popular object. Part 1 of the answer states that is "Honey" object Part 2 counts the number of references to be 12. It should be 16. This is so as "b1.beeHA" also has 4 references to the "Honey" object.

R Chandrashekar  Oct 29, 2012 
Printed Page 270
Section "Popular Objects"

Section "Popular Objects" gives the answer of the exercise at page 267. I think the answer is wrong by saying " There are a total of 12 active references to..." It should be 16 because code " b1. beeHA = ha;" adds another 4 references to Honey object.

Yang Yu  Apr 17, 2013 
Printed Page 271
Bottom

Does not explain solution to fixing LifeSupport code: Add super class radiator, change V2Radiator to extend radiator and add super(list) constructor, change V3Radiator to extend radiator. class Radiator{ Radiator(ArrayList<SimUnit> list){} } class V2Radiator extends radiator { V2Radiator(ArrayList<SimUnit> list) { super(list); for(int x=0; x<5; x++) { list.add(new SimUnit("V2Radiator")); } } } class V3Radiator extends radiator { V3Radiator(ArrayList<SimUnit> lglist) { super(lglist); for(int g=0; g<10; g++) { lglist.add(new SimUnit("V3Radiator")); } } }

Douglas Ken Larson  Oct 14, 2011 
Printed Page 274
code snippet with examples of java.lang.Math usage

java.lang.Math.round makes a resultu of type long , not int IS: int x = Math.round(42.2); SHOULD BE: long x = Math.round(42.2);

Anonymous  Dec 21, 2012 
Printed Page 291
Assignments paragraph

The assignment Double d = x don't work because of type mismatch. An Integer is not a double.

Anonymous  Sep 06, 2011 
Printed Page 298
middle, [width] comment

"if it is less than the width, it'll be padded with zeroes" ...should be: "if it is less than the width, it'll be padded with spaces. To pad with zeroes, specify a leading zero for the width (i.e., 06)".

Ken A Collins  Jul 02, 2011 
Printed Page 305
An example of working with a Calendar object

In the code lines instead of "c.HOUR_OF_DAY", "c.DATE" must be "Calendar.HOUR_OF_DAY", "Calendar.DATE"

Alexey  Sep 26, 2015 
PDF Page 327
PDF bookmarks

Duplicate bookmarks "Finally: for the things you want to do no matter what." appears in the book index twice and both instances point to the top of page 327.

Anonymous  Feb 09, 2016 
Printed Page 328
code sample

I don't know if things are more strict now but in Java 1.6 on a Mac and in Java 1.7 on a PC the compiler requires me to define the exception or to use a predefined one. Solution 1 add this class to the code sample static class ScaryException extends Exception { // nothing else is required } Solution 2 change all references to ScaryException to Exception 1 in the catch block 2 in doRisky after throws 3 in doRisky after throw new

Donald Cook  Jul 30, 2012 
Printed Page 328
code snippet - class TestExceptions

1. @Don Cook > static class ScaryException extends Exception { > } static keyword is not necessary, following code should be enought: class ScaryException extends Exception { } ---- 2. I think, that return statement in method doRisky is not needed, imho code should be like this: static void doRisky(String test) throws ScaryException { System.out.println("start risky"); if ("yes".equals(test)) { throw new ScaryException(); } System.out.println("end risky"); } ----

&#321;ukasz Siwi&#324;ski  Jan 17, 2013 
Printed Page 328
N.B. 2nd edition - content of Flow Control example

The Flow Control example does not compile (Java 8) because the exception name, ScaryException, is undefined. The following line has to be added: class ScaryException extends Exception {} Does the example compile with earlier versions of Java ? Or does no one work the Sharpen your pencil tests ?

nicholas.cole@free.fr  Feb 24, 2018 
Printed Page 338
Snippet marked with (2)

// -------------------------------------------------------------------- // in the snippet marked (2) there is following code: try { Foo foo = new Foo(); foo.foof(); } int y = 43; } catch (FooException fex) { System.out.println("handle FooException"); } // -------------------------------------------------------------------- // it shold be rather like this (one bracket too much): try { Foo foo = new Foo(); foo.foof(); } int y = 43; catch (FooException fex) { System.out.println("handle FooException"); } // --------------------------------------------------------------------

&#321;ukasz Siwi&#324;ski  Jan 23, 2013 
Printed Page 342
nearly at the end of the code

The code as it is does work, but after it is finished something stays active because the player is not stopped when finished. This can be solved by inserting the following code between "player.start();" and "} catch ...": long length = player.getTickLength(); Thread.sleep(length*200); player.close(); This happens at least another time in a similar piece of code on another page.

Anonymous   
Printed Page 342
End of block 4

The app throws an exception: java.lang.IllegalStateException: sequencer not open Add the following line of code right before player.start(); player.open(); This exception was thrown using java JDK 1.5.0 update 11 and Windows 8.1

Anonymous  Aug 03, 2015 
Printed Page 346
4th line inside try { }

Couldn't find where MidiEvent event is used. Maybe this line isn't necessary and may be removed (the code compiles and works without it).

Anonymous  Jan 19, 2010 
Printed Page 350
main hint for across 18

Java currently has 50 keywords including enum added in Java 5. The book reflects it well at page 53 by showing the 50 keywords all in a table. But at page 350 the hint for across 18 of JavaCross 7.0 suggests that the number is 49. Accordingly, changing 18. One of Java's '49' to 18. One of Java's '50' would be one more step towards the perfection of the book. ref. https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html

Anonymous  Nov 21, 2014 
PDF Page 351
True or False section

Missing plural "s": 4. False, runtime exception can be caught. Correction: 4. False, runtime exceptions can be caught.

Anonymous  Feb 09, 2016 
Printed Page 354, 368
section of Making a GUI is easy and the EVENTS section of the Bullet

Points page; Java 5 has changed a way to add a component to a JFrame. And that could change the code you have written for chapter 12 to chapter 15. Java 1.4.x and earlier versions require that we have to add components to the frame's content pane. But Java 5 doesn't require that. So instead of writing: frame.getContentPane().add(aJButton); frame.getContentPane().add(aJPanel); ... we could implicitly add a component to a frame without getting the content pane of the frame: frame.add(aJButton); frame.add(aJPanel); etc. And if we're concerned about the compatibility issue, then it is safe to continue using frame.getContentPane.add(...);

Anonymous   
Printed Page 360
Code at the bottom - button.setText("I've been clicked");

Entered the code on this page into both Eclipse and BlueJ IDE's and got a NullPointerException at this line of code when I click'ed on the button.

Don Morrison  Oct 09, 2013 
PDF Page 360
Margin text

Extra dot (for period) or missing dot (for ellipsis): Implement the ActionListener interface’s actionPerformed() method.. This is the actual event-handling method! Possible correction: Implement the ActionListener interface’s actionPerformed() method. This is the actual event-handling method!

Anonymous  Feb 21, 2016 
Printed Page 366
Box at the right side of the page

Below Graphics reference is stated: drawPolygon. Correct is: drawPolygon()

Anonymous  Jan 15, 2015 
Printed Page 379
code sample

This program has a side effect. The first time you click the Change Label button the frame is resized, and every time the frame is resized the paintComponent method is called by the JVM. This changes the color of the circle. You can prevent this by saving the startColor and endColor in instance variables, and use a boolean instance variable to change the color only when you click the Change Color button. Note: you also need to set the color when you set up the panel.

Donald Cook  Aug 03, 2012 
Printed Page 392
End of try block in go()

Call to sequencer.setTempoInBPM(120) should probably be done before sequencer.start().

Anonymous   
Printed Page 392
just before halfway the code

In the method setUpGui() I am missing the middle line of the next three lines: f.setContentPane(m1); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setBounds(30, 30, 300, 300); And near the end of the page I am missing long length = (long) (sequencer.getMicrosecondLength()/1000); Thread.sleep(length); sequencer.close(); as well, between "sequencer.setTempoInBMP(120);" and "} catch...".

Anonymous   
PDF Page 392
setUpGui methode

Should add f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); to close the tread when we close the window, as-is we need to do a ctrl-x to get the command line back.

Jean-Sebastien Gasse  Jun 14, 2012 
PDF Page 392
In the go methode of MiniMusicPlayer3

It is just a "nice to have" but instead of using direct integers for event types, I would have liked to see the constants provided by ShortMessage used. So we would change track.add(makeEvent(144, 1, r, 100, i)); track.add(makeEvent(176, 1, 127, 0, i)); track.add(makeEvent(128, 1, r, 100, i+2)); to track.add(makeEvent(ShortMessage.NOTE_ON, 1, r, 100, i)); track.add(makeEvent(ShortMessage.CONTROL_CHANGE, 1, 127, 0, i)); track.add(makeEvent(ShortMessage.NOTE_OFF, 1, r, 100, i+2)); I find it easier to read NOTE_ON, NOTE_OFF and know what it does than 144 and 128

Jean-Sebastien Gasse  Jun 14, 2012 
Printed Page 394
Hints 3 and 10

The hint reads, "The listener's key method" which is very ambiguous due to the variety of event types. Based on the answer provided on 397, the hint should really read, "The ActionEvent listener's key method" Correspondingly: The hint "How a listener signs up" should read "How an ActionEvent listener signs up"

Tim Bradt  Aug 30, 2015 
Printed Page 421
2nd paragraph

When the program is run the labels don't line up with the checkboxes, and since the program is using swing change the Label to JLabel. Box nameBox = new Box(BoxLayout.Y_AXIS); for (int i = 0; i < 16; i++) { nameBox.add(new Label(instrumentNames[i])); } To make everything line-up you can change your code to this GridLayout grid2 = new GridLayout(16,1); grid2.setVgap(1); grid2.setHgap(2); JPanel mainPanel2 = new JPanel(grid2); for (int i = 0; i < 16; i++) { mainPanel2.add(new JLabel(instrumentNames[i])); }// end loop background.add(BorderLayout.EAST, buttonBox); background.add(BorderLayout.WEST, mainPanel2);

Anonymous   
Printed Page 421
BeatBox all versions at least through Ch 14

On my system: Windows Vista, Java 1.6.03, Java SE RE 1.6.03-b05, these programs do not release the CMD prompt on close. I fixed it by adding: abstract class MyExitListener implements WindowListener { public void windowClosing(WindowEvent e) { sequencer.stop(); } } as an inner class. Maybe there's a better way?

Anonymous   
Printed Page 422
immediately before try{} block

"track.add(makeEvent(192, 9, 1, 0, 15));" and associated comment. This does not produce the intended result. It generates an event on tick 15, at the start of beat sixteen. The track needs to be 16 beats long, so we need to guarantee an event at the END of beat sixteen - i.e. on tick 16. The overall code as it stands works only because of the presence of "track.add(makeEvent(176, 1, 127, 0, 16));" at the end of the preceding block, which adds sixteen (!) controller events to the track, presumably cut and pasted from the "track.add(makeEvent(176, 1, 127, 0, i));" on page 390 in an effort to cure the irregular rhythm otherwise produced. My suggestion would be to delete "track.add(makeEvent(176, 1, 127, 0, 16));" and replace: "track.add(makeEvent(192, 9, 1, 0, 15));" with "track.add(makeEvent(176, 9, 120, 0, 16));" which has the effect of inserting an "All Sound Off" command at the end of beat sixteen and applying it to channel 9 (the percussion instruments) which we are using. (This seems more appropriate here than the "Program Change" command (192,...) or applying an "All Notes Off" command (176, 1, 127,...) to channel 1 which might actually be in use in another part of a more complex program.

HandyAllan  Dec 31, 2010 
Printed Page 445
Declaration of instance attributes of GameCharacter

The instance attributes should be private to force using the getters.

Anonymous  Sep 17, 2011 
Printed Page 450/451
JPanel declaration

1. The LayoutManager of the JPanel should not be the default, FlowLayout to pass the outfit on page 448. 2. The inner classes should be private to prevent unclassified acces from outside.

Anonymous  Sep 17, 2011 
Printed Page 456
code listing of class QuizCardPlayer

Program QuizCardPlayer has some issues: 1. if you click "Next Card" button before loading any quiz file then Exception will be thrown on console 2. you can only load one quiz, every another (after seeing message "That was last card") won't execute & it'll throw and Exception on console. My solution for above issues is this patch: --------------------------------------------------------------------------- --- a/hfj-en/src/ch14/QuizCardPlayer.java +++ b/hfj-en/src/ch14/QuizCardPlayer.java @@ -43,6 +43,7 @@ public class QuizCardPlayer { display.setFont(bigFont); display.setLineWrap(true); display.setEditable(false); + display.setText("Load cards using menu!"); JScrollPane qScroller = new JScrollPane(display); qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); @@ -51,6 +52,7 @@ public class QuizCardPlayer { mainPanel.add(qScroller); mainPanel.add(nextButton); nextButton.addActionListener(new NextCardListener()); + nextButton.setEnabled(false); JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("File"); @@ -126,6 +128,9 @@ public class QuizCardPlayer { System.out.println("couldn't read the card file"); ex.printStackTrace(); } + nextButton.setEnabled(true); + display.setText(""); + currentCardIndex = 0; }

&#321;ukasz Siwi&#324;ski  May 10, 2013 
Printed Page 457
method loadFile

The interface of the Quiz Card application allows the user to load more than one card set (sequentially). Loading a second card set after you've played with the first one produces problems. At the end of method loadFile before the call to showNextCard, insert: nextButton.setEnabled(true); If you are following the text of the printed edition, insert also at the same point: currentCardIndex = 0; The scheme followed in the download code avoids this latter problem - looks like the authors (post publication) realised that, using the more up-to-date and much neater approach, they needed to initialise their Iterator but forgot earlier to initialise their iterator (

HandyAllan  Dec 10, 2010 
Printed Page 457
instance method loadFile()

After reader.close(); should be the currentCardIndex attribute set to 0. Otherwise it's not possible to play again in the same running.

Anonymous  Sep 17, 2011 
Printed Page 463/464
code examples

The os and is descriptors should be closed after usage os.close(); is.close();

Anonymous  Sep 18, 2011 
Printed Page 483
How it works 3

Socket sock = serverSock.accept(); When serverSock.accept() returns, it does not return a socket on a different port. It still uses port 4242. This is easily demonstrated by modifying the DailyAdviceServer.java slightly: public void go() { try { ServerSocket serverSock = new ServerSocket(4242); while (true){ Socket sock = serverSock.accept(); PrintWriter writer = new PrintWriter(sock.getOutputStream()); writer.println("This socket port is: " + sock.getLocalPort()); writer.close(); } } catch (IOException ex) { ex.printStackTrace(); } } The text states "The socket is on a different port than the ServerSocket, so that the server socket can go back to waiting for other clients". This isn't the case. The thing that has to be unique for each socket is the source port, source ip, destination port & destination ip. Regards Richard ps: I think Head First Java is an excellent book.

Richard Hayward  Feb 04, 2012 
Printed Page 485
6th bullet point

A client does not make a server socket but a socket.

Anonymous  Sep 19, 2011 
Printed Page 487
SimpleChatClientA.go() code

Problem ======= Chat client won't close if You click "close" button. My solution ========= There is: setUpNetworking(); frame.setSize(400, 500); frame.setVisible(true); It should be: setUpNetworking(); frame.setSize(400, 500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);

siwinski.info  Jun 06, 2013 
Printed Page 512
The dreaded "Lost Update" problem code snippets.

**Problem** Imho below code after running it, doesn't clearly show how synchronize works. The code to change: // p. 512 public void run() { for(int i = 0; i<50; i++){ increment(); System.out.println("balance is " + balance); } } public void increment() { int i = balance; balance = i + 1; } // p. 514 public synchronized void increment() { int i = balance; balance = i + 1; } **My solution** Imho below code is better way to show (after running it) how synchronize can nicely grant/schedule access to methods by two (or more threads). // p. 512 public void run() { for(int i = 0; i<50; i++){ increment(); } } public void increment() { int i = balance; balance = i + 1; System.out.println("balance is " + balance); } // p. 514 public synchronized void increment() { int i = balance; balance = i + 1; System.out.println("balance is " + balance); }

siwinski.info  Jun 28, 2013 
PDF Page 512,514
In the program TestSync

The print statement: System.out.println("balance is " + balance); should be within the increment method. Otherwise, the program shows unordered balance output even after it is synchronized.

Anonymous  Apr 08, 2016 
Printed Page 518
@ code

**Problem** The chat client won't stop working after closing window. **Solution** Below code: frame.getContentPane().add(BorderLayout.CENTER, mainPanel); frame.setSize(800, 500); frame.setVisible(true); Should be changed to: frame.getContentPane().add(BorderLayout.CENTER, mainPanel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 500); frame.setVisible(true);

siwinski.info  Jul 08, 2013 
Printed Page 520-21
p. 520, code line 7; p. 521 code line 6

ArrayList requires an object-type to be defined. It has already been pointed out in Code Ranch but hasn't been added to the official errata list. However, the program written in the Ready-bake Code for the VerySimpleChatServer doesn't run if the object type is missing. p. 520, code line 7 has "ArrayList clientOutputStreams;" which should be corrected to "ArrayList<Writer> clientOutputStreams;" p. 521, code line 6 has "clientOutputStreams = new ArrayList();" which should be corrected to "clientOutputStreams = new ArrayList<Writer>();" Correction is mentioned here: https://www.coderanch.com/t/591427/java/java/VerySimpleChatServer-ready-bake-code-JavaHeadFirst I hope the mistake is added to the official errata list. Thank you for your great book, I love the series.

Anonymous  Oct 18, 2012 
Printed Page 526
code snippet that is solution for "code magnets" exercise

**Problem** Presented solution (and the initial code magnets given to be resolved) won't produce expected results each time when it's compiled & runned on Windows 7 (64 bit) using Oracle's JVM as follow: $ javac -version javac 1.7.0_07 $ java -version java version "1.7.0_25" Java(TM) SE Runtime Environment (build 1.7.0_25-b17) Java HotSpot(TM) Client VM (build 23.25-b01, mixed mode, sharing) **Solution** Changing code as below will make it more likely to achive the behaviour similar to that which was expected in the book. Of course it'll produce different output than was expected in book and the output won't allways be the same, because each line is not an atomic (synchronized) operation. Change 1 - change code in ThreadOne class: for(int x=0; x < 98; x++) { a.updateCounter(1000); To this: for(int x=0; x < 98; x++) { System.out.println("--1: " + a.getCount()); a.updateCounter(1000); Change 2 - change code in ThreadTwo classf from this: for(int x=0; x<99; x++) { a.updateCounter(1); To this: for(int x=0; x<99; x++) { System.out.println("--2: " + a.getCount());

siwinski.info  Jul 19, 2013 
Printed Page 542
comment on the code snippet

**Problem** There is a typo in comment to code snippet. Word "is" in below paragraph is redundant: ## Here's the important part! Whatever "E" is determines what kind of things you're allowed to add to the ArrayList. **Solution** It should look like this: Here's the important part! Whatever "E" determines what kind of things you're allowed to add to the ArrayList.

siwinski.info  Jul 29, 2013 
Printed Page 564
middle comment

Change "We can add all the songs from the HashSet..." to "We can add all the songs from the ArrayList..."

Ken A Collins  Jul 06, 2011 
Printed Page 566
2nd code block

In the second code block (class Test) the statemest is: tree.add(new Book("How Cats Work"); instead of: tree.add(b1); becase b1 is already declared and instantiated above, plus there is one closing paranthesis missing.

Anonymous  Jul 26, 2016 
Printed Page 569
bottom command prompt window

There should only be three lines of "animal eating" output from the TestGenerics2 program, not six.

Ken A Collins  Jul 06, 2011 
Printed Page 570
screenshot showing compilation class TestGenerics3

There is: % java TestGenerics3 Should be: % javac TestGenerics3.java

Lukasz Siwinski (siwinski.info)  Mar 11, 2014 
Printed Page 575
Answer of "There are no dumb questions" section

The two alternative versions of the signature of the generic method takeThing, i.e. public <T extends Animal> void takeThing(ArrayList<T> one, ArrayList<T> two) and public void takeThing(ArrayList<? extends Animal> one, ArrayList<? extends Animal> two) are implicitly presented as equivalent, but they have different semantics. For example, under the assumption that Cat and Dog are subtypes of Animal, takeThing(ArrayList<Dog>, ArrayList<Cat>) is legal in the second version, but is illegal in the first version.

Julien Cretel  Nov 11, 2015 
Printed Page 576
3rd item in compiles list

List<Animal> list= new ArrayList<Animal>() ArrayList being implementation of List interface, List reference variable can hold the ArrayList object reference.

Amit Khurana  Jul 19, 2012 
Printed Page 618
Step three -- run rmic

Erroneous information. As of Java 5, there is no need to run rmic command unless backwards compatibility is desired. RMI generates stubs on the fly (in memory) and skeletons are no longer needed. Running rmic command will no longer produce a skeleton.

Ken A Collins  Jun 01, 2011 
Printed Page 619
bottom try { } block

Change "Remote Hello" to "Remote_Hello". Code bombs with "java.net.MalformedURLException: invalid URL String" error if remote object name contains spaces.

Ken A Collins  Jun 01, 2011 
Printed Page 620
Naming.lookup() statement in two places on page

Same error as page 619. Change "Remote Hello" to "Remote_Hello". Code bombs with "java.net.MalformedURLException: invalid URL String" error if remote object name contains spaces.

Ken A Collins  Jun 01, 2011 
Printed Page 622
whole page

Stub and skeleton class files are not needed as of Java 5.

Ken A Collins  Jun 01, 2011 
Printed Page 625
two diagrams in bottom half of page

Class file located on Web Server that responds to client request should be named "RegisterServlet.class", not "MyServlet.class".

Ken A Collins  Jun 01, 2011 
Printed Page 629
servlet code

Problem ======= There's a omission typo in KathyServlet code. My solution ========= There is: out.println("<P>" + PhraseOmatic.makeAPhrase()); It should be: out.println("<P>" + PhraseOmatic.makeAPhrase() + "</P>"); ----

siwinski.info  Jul 07, 2014 
Printed Page 644
top

It is not necessary to import the java.io.* package in the DiceService.java program.

Ken A Collins  Jun 08, 2011 
Printed Page 645
top

It is not necessary to import the java.io.* package in the MiniMusicService.java program.

Ken A Collins  Jun 08, 2011 
Printed Page 647
top

It is not necessary to import the java.io.* package in the DayOfTheWeekService.java program.

Ken A Collins  Jun 08, 2011 
Printed Page 653
line 21

replace: "track.add(makeEvent(192, 9, 1, 0, 15));" with "track.add(makeEvent(176, 9, 120, 0, 16));" See my comments on similar erratum on page 422

HandyAllan  Dec 31, 2010 
Printed Page 655
lower third

the section in the final beatbox code contains a class called "MyPlayListener" that is not used anywhere. also I found comments in the code that says "exactly the same" but its not the same ...for instance the use of the Iterator in the makeTracks method...this is not the same as found on page 423 in makeTracks. also the use of numKey in the same method BUT IT'S STILL A REALLY GREAT BOOK!!!

Anonymous  Jan 06, 2010 
Printed Page 658
code snippet, method [public void go()]

PROBLEM: Missing semicolon in this line: ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream()) This causes compilation error. SOLUTION Code should be look like that: ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());

siwinski.info  Aug 01, 2014 
Printed Page 673
one-third of way down and bottom

Comment one-third of way down: ...the "sing()" method), if sing() is called... should state: ...the "sings()" method), if sings() is called... Comment at bottom, to right of command prompt: ...basic "sing()" method... should state: ...basic "sings()" method...

Ken A Collins  Jun 08, 2011 
Printed Page 678
index for the alphabet B

When i looked up the index for Brain barbell, i found that the pages listed for it (33,167,188) were actually pointing t Brainpower and not brain barbell.

Anonymous  Oct 08, 2011 
ePub Page 3176
start of code

missing "*" import java.io; should be import.java.io.*;

Ted Schantz  Aug 28, 2013 
ePub Page 3685
bottom

chapter 6 zip file does not have the code for the helper class. The downloadable code for helper class is misplaced in chapter 5 zip, instead it should be in chapter 6 zip. A simpler basic version of the helper code should be chapter 5 zip

Anonymous  Aug 29, 2013 
Mobi Page 7838
Kindle version near locations 7838 and 7861, inside "for" loop

In the code for MiniMusicPlayer2 and MiniMusicPlayer3 (a few pages later), inside the for loop, there are three calls to "track.add()". On my version of Java (1.8.0_74) the notes will not play if event 176 (CONTROL_CHANGE) is added *between* events 144 (NOTE_ON) and 128 (NOTE_OFF). But, if the code is change to add 176 *first*, the notes play. I.e. change track.add(makeEvent(144,1,i,100,i)); track.add(makeEvent(176,1,127,0,i)); track.add(makeEvent(128,1,i,100,i+2)); to track.add(makeEvent(176,1,127,0,i)); track.add(makeEvent(144,1,i,100,i)); track.add(makeEvent(128,1,i,100,i+2));

Anonymous  Apr 25, 2016