「Java謎+落とし穴徹底解明」正誤表

このページは、拙書「Java謎+落とし穴徹底解明」技術評論社 ISBN4-7741-1361-1 の正誤表です。

p.213からのX-Drawのソースに関する訂正は、別ページに分けました。

日付順のインデックス
X-Drawのソースに関するバグ(2003/7/6)


p.25

「ほげを考えるページ」は、現在オリジナルが公開されていませんので、 作者の吉田さんの許可を得まして、私のページに転載させていただきました。

URLは、
http://member.nifty.ne.jp/maebashi/programmer/hoge.html(移転済み)
http://kmaebashi.com/programmer/hoge.html(移転後)
です。


p.28

Javaチュートリアルについて、英語版しかないという記述がありますが、 書籍でなら日本語版も出ています。

http://www.amazon.co.jp/exec/obidos/ASIN/4894714043/ref=sr_aps_d_1_1/249-9160691-3241928

一応補足しておきます。


p.34 Fig1.3 図中

DrawLine()などの公開された関数

drawLine()などの公開された関数


p.37 3行目

fillPatternCodeで指定される

fillPatternCodeで指定される中塗りパターン


p.54

なお、コンストラクタを書かない場合、

public Circle() {}

というコンストラクタ(何もしないコンストラクタ) をコンパイラが自動的に生成します。

なお、コンストラクタを書かない場合、

Circle() {}

というコンストラクタ(何もしないコンストラクタ) をコンパイラが自動的に生成します。

この例ではクラス自体がpublicではないですから、 コンストラクタにもpublicは付きません(JLS 8.8.7)。

あと、実際にはコンパイラはデフォルトコンストラクタの中に super()の呼び出しも挿入しますが、 それは他のコンストラクタでも同じことですし、 ここで説明することではないと思うので省略します。


p.68補足 Singleton の8行目

private staticなフィールドの指す先に唯一のフィールドを 生成することにより実現します。

private staticなフィールドの指す先に唯一のオブジェクトを 生成することにより実現します。

p.74 8行目

ことにになり

ことになり


p.80Fig2.4

図中のP1, P2はそれぞれp1, p2(小文字)です。


p.9012行目

p2 = new Point();

p2 = new Point2D();

p.994行目

その方法については「6.5 clone()とCloneable」で説明します.

「その方法」の「その」は「深いコピー」を指しますが、「6.5 clone()とCloneable」には、clone()をオーバーライドする方法する方法のみ説明していて、実際に扱っているのは浅いコピーですね。

clone()をオーバーライドする方法までは説明しているので、あとは読者の宿題ということでもよいかと思いますが、7.3.1に深いコピーの具体的な実装があります。


p.104Fig.2.14

プログラムリストに合わせると、ここで設定されている値は、「1 2 3 4 …」ではなく「0 1 2 3 …」です。


p.117Fig2.22

図中のX, Yはそれぞれx, y(小文字)です。


p.134オネアミスの囲みの中、10行目

そこにいること自体、誰かが必要と認める、

そこにいること自体、誰かが必要と認める、

p.147 JLSからの引用部

"An object is a class instance or an array. The reference values (often just references) are pointers to these objects."

"An object is a class instance or an array. The reference values (often just references) are pointers to these objects."

原文の強調部分が強調されていませんでした。


p.155 4-6行目

for (int i = 0; i < shapes.length; i++) {
    System.out.println("shape[" + i + "].color..." + shape[i].color);
}

for (int i = 0; i < shapes.length; i++) {
    System.out.println("shapes[" + i + "].color..." + shapes[i].color);
}

p.166下から2行目

コンパイラが勝手にinstanceofとelseifに相当するコードを吐くのなら

コンパイラが勝手にinstanceofとelse ifに相当するコードを吐くのなら


p.168Table3.2の下

ちなみにですが、C++ではデフォルトの状態でオーバーライドを禁止しており

ちなみにですが、C++ではデフォルトの状態でオーバーライドは不能になっており

C++の場合、無指定のメソッドをサブクラスで再定義することはできますが、 どのメソッドが呼び出されるかはコンパイル時の型で決定します。 「禁止」と言うと、コンパイルエラーになりそうに読めますので、訂正します。

なお、これをオーバーライドと呼んでいるC++の入門書もあるようですが、 本書はJavaの本ですので、 オーバーライドと言えば実行時の型によって選択されるものを指すと思ってください。


p.203NOTE(横の注)

IntStackがIntArrayの一部であり

IntArrayがIntStackの一部であり


p.212Fig.3.16 スクリーンショットのボタン

Polyine

Polyline

実行結果が間違っていますので、対応するソースも間違っています。


p.212Fig.3.16 スクリーンショットのボタン

Polyine

Polyline

実行結果が間違っていますので、対応するソースも間違っています。


p.227下から11行目〜

interface Visitor {
    visitPolyline(Polyline polyline);
    visitCircle(Circle circle);
    visitRectangle(Rectangle rectangle);
}

interface Visitor {
    void visitPolyline(Polyline polyline);
    void visitCircle(Circle circle);
    void visitRectangle(Rectangle rectangle);
}

p.2282行目

void accept(Visitor v) {
  v.visitPolyline(polyline);
}

void accept(Visitor v) {
  v.visitPolyline(this);
}

p.2287行目

Visitorの中にvisitPolyline(), visitCircle, visitRectangleという〜

Visitorの中にvisitPolyline(), visitCircle(), visitRectangle()という〜


p.240Fig4.3

CLASSPAHT

CLASSPATH


p.2515.1.3 の5行目

しかし---たとえばこんなメソッドをPrintクラスに追加して

しかし---たとえばこんなメソッドをPrinterクラスに追加して

p.253 Fig5.1

クラスを表現する箱がふたつあって、 両方に「PrinterMain」と書いてあります。

run()とmainMethod()を含むのはPrinterクラスですから、右側の箱は 「Printer」です。


p.256

こういう事態を避けるためには、上記のような「やばいところ」 (クリティカルセッション(critical session)と呼びます)

こういう事態を避けるためには、上記のような「やばいところ」 (クリティカルセクション(critical section)と呼びます)

情けない話ですが... ずっと、critical sessionだと思い込んでいました(_o_)


p.273

  class HogePackageException {

  class HogePackageException extends Exception {

p.2785.3.2 1行目

実際には、直列化を行なうには単にObjectOutputStreamの readObject()を一発呼ぶだけではダメで、

実際には、直列化を行なうには単にObjectOutputStreamの writeObject()を一発呼ぶだけではダメで、

p.34033行目(下から3行目)

その場合FactoryTestImplの各メソッドは

その場合WindowTestImplの各メソッドは


p.35033行目(下から3行目)

} catch (Exception ex) {
    err.printStackTrace(); 

} catch (Exception ex) {
    ex.printStackTrace(); 

p.346

LabelAlignmentが直列化を前提としたクラスなら、 implements Serializableしていないと変だろう、という問題もありますが。

JDK1.2以降のJavaでは、デシリアライズで生成されるオブジェクトを制御する 手段が提供されています。詳細は「補足(いいわけ?)」コーナーの、 「7.2 列挙型を作る」についてを 参照してください。


p.352

デバッグライトでクラス名を取得するため、SecurityManagerの getStackTrace()を使う方法を紹介していますが、JDK1.4からは、 例外オブジェクトそのものからクラス名・メソッド名を取得する方法が 提供されています。詳細は補足を 参照してください。


p.354 List7.1 1行目

import java.security.*;は不要です。


p.355 1行目

SecurityManagerのgetStackTrace()メソッドは

SecurityManagerのgetClassContext()メソッドは


p.357 22行目

兼ね合いもなどあるでしょう.

兼ね合いなどもあるでしょう.


p.3641行目
10:  public void mouseClickde(MouseEvent e) {

第3刷からは、「Clickde」の「de」のところにカケアミを入れました。


p.3651行目

Colorというフィールド

colorというフィールド


p.3821行目

「関数へのポインタ」の項について、176ページだけでなく、194ページを追加。

Cプログラマが索引を引く際、知りたい情報はむしろこちらだと思われるためです。


「Java謎+落とし穴徹底解明」のページに戻る | トップページに戻る