ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[正誤表] 群論の味わい-置換群で解き明かすルービックキューブと15パズル 正誤表ほか

 
『群論の味わい-置換群で解き明かすルービックキューブと15パズル』
「2012年2月1日 初版3刷発行」の正誤表

P.97
(誤) UFR = (6, 16, 21)(7, 18, 25)(10, 17, 24)(8, 19, 22).
(正) UFR = (2, 30, 12)(6, 16, 21)(7, 18, 25)(10, 17, 24)(8, 19, 22).

P.143
系5.11.9
(誤) ... ∪x ∈ S G/stabG(x) = Z(G) ∪ x ∈ S' G/stabG(x)
(正) ... ∪x ∈ S G/stabG(x) = G/G ∪ x ∈ S' G/stabG(x)

※ 定義 5.6.8 (P.120) と 補題 5.10.22 (P.140) により、x ∈ Z(G) なら stabG(x) = G.
  x ∈ S G/stabG(x) = x ∈ Z(G) G/stabG(x) ∪ x ∈ S' G/stabG(x) = G/G ∪ x ∈ S' G/stabG(x).

P.143
(誤) sage: class_eqn = sum([G.order()/(G0.Centralizer(x)).Order()
(正) sage: class_eqn = sum([G.order()/(G.centralizer(x)).order()

P.145
(誤) x = H として系5.11.9 を使います.
(正) x = H として命題 5.11.8 を使います.

P.222
命題 9.4.9 の証明
(誤) ここで,(i, j)(k, l) = (i, j, k)(i, l, k) および (i, j)(j, k) = (i, k, j) が成り立つので,
(正) ここで,(i, j)(k, l) = (i, j, k)(j, k, l) および (i, j)(j, k) = (i, j, k) が成り立つので,

※ 互換の積が左から右の順なら(誤)の記述で正しいですが、
  互換の積は、右から左の順なので(P.68 (3.1) 参照)誤記です。
  原文も(正)の記述だと思います。

P.238
(誤) Cdn ⋊ Sn は,Cn の元を 0 でない成分とする n × n 単項行列すべての群に同型となることが知られています

※これが正しいとすると「Cn の元を 0 でない成分とする n × n 単項行列すべての群」は d に無関係であるので、結果、C3n ⋊ Sn と C5n ⋊ Sn が同型となってしまいます。
また、「Cn の元を」を「Cd の元を」と直しても、例9.7.8 では Cd = {0,1,...,d-1} としてるので、n × n 単項行列の 0 でない成分を Cd の元 0 で置き換えると単項行列ではなくなる、という問題が残ります。[R] J.J. Rotman, An Introduction to the Theory of Groups 4th ed. に従えば、C_d の扱いは加法群ではなく乗法群ではないか。

P.257
(誤) 〈 x | x4 = 1, y2 = 1, xy = yx 〉
(正) 〈 x, y | x4 = 1, y2 = 1, xy = yx 〉



以下は、記述内容が疑問な箇所です。

P.225
研究課題 9.5.8
n ≧ 4 を偶数として,H = D_n ⊂ Sn および N = An とします.第2同型定理を用いて,HN = Sn を示して下さい。

→ 第2同型定理でどうにかなるのだろうか。

P.251
補題 10.2.2 の証明

→ Fn は自由群だから定義 10.2.2 より x と x-1 が隣り合うことはないはずなのに
  証明のアルゴリズムには「xi・xi-1 の形の式に(もしあれば)」とあるのが、わからない。
  それから、定義10.2.1 によれば可解な語の問題は w = g が成り立つかどうかを決定する問題なのに、
  証明は w = 1 が成り立つかどうかの問題となっている。これらが同等な問題であることは示されていない。

P.265
Cmn ⋊ Sn+1 を,Cm 係数の可逆な (n+1)×(n+1) 単項行列 g でその行列式が次の条件を満たすものによる群と同一視します: p を置換行列, d を対角行列として,g = p・d と表したときに, det(d)=1 となる.

→ Cm 係数とは何を意味するか。対角行列を作るには係数に 0 が使えることが必要であり、
  P.106 定義 5.2.2 とP.238 例 9.7.8 によれば Cm には 0 が含まれる。
  しかし det(d)=1 の条件より対角行列 d の対角成分には 0 が取れない。
  ここで Cm は、定義 5.2.2 通りに加法群として扱ってよいのか。
  Cm に 0 を含めてもよいのか。Cm は乗法群ではないのか。

[正誤表] JavaScript 第5版 初版第9刷 正誤表

 
前書きにある通り、サンプルコードは原著のサイトからダウンロードできます。
次のURLを開き、右側のメニューにある Download Example Code を辿ってみてください。
http://www.oreilly.com/catalog/jscript5/

上のリンクからも辿れますが、以下のリンク先に原著の正誤情報が掲載されています。
本記事に示す正誤表のいくつかの項目は、このリンク先が情報源になっています。
なお、原著の正誤情報は数が多いので、すべて拾いきれてません。

Confirmed Errata
http://oreilly.com/catalog/errata.csp?isbn=9780596101992

Unconfirmed Errata
http://oreilly.com/catalog/errataunconfirmed.csp?isbn=9780596101992



以下、「JavaScript 第5版 初版第9刷」で見つかった誤記です。
一部、補足めいたものもあります。

p.113
var undefs = [,,];   // 2個の要素を持つ配列。両要素とも未定義。
→ Firefox は2個だが、Internet Explorer は3個の要素が出来る。

p.119
2番目の引数を省略すると、指定された開始位置から配列の最後までの要素がすべて削除されます。

→ 2番目の引数を省略すると、Firefox では本文にあるとおり、
指定した位置以降のすべての要素を削除するが、
Internet Explorer 9 や Opera では、何も削除しない。

p.136
(誤)  if (window.screenLeft) { // IE など

(正) if (window.screenLeft !== undefined) { // IE など
Geometry.getWindowX = function() { return window.screenLeft; };
Geometry.getWindowY = function() { return window.screenTop; };
}
(誤) else if (window.screenX) { // Firefox など
(正) else if (window.screenX !== undefined) { // Firefox など
Geometry.getWindowX = function() { return window.screenX; };
Geometry.getWindowY = function() { return window.screenY; };
}
※ IE も Firefox もフルスクリーン・モード(F11押下)で Geometry オブジェクトを初期化すると、
  window.screenLeft も window.screenX も 0 になり、if条件を満たせなくなってしまうため。

p.139
function copyUndefinedProperties(/* オブジェクト */ from, /* オブジェクト */ to) {

for(p in from) {
(誤) if (!p in to) to[p] = from[p];
(正) if (!(p in to)) to[p] = from[p];
}
※ !演算子は、in 演算子よりも優先度が高いので、括弧が必要。
 元のコードでは プロパティ名 p に対して !p は常に falseに評価され、
 "false" という名前のプロパティを to オブジェクトが持たない場合、
 条件判定は常にfalseとなり、持つ場合は常にtrueとなる。

p.152
しかし、コンストラクタから別のオブジェクトを返すことは可能です。
そうすると、返されたオブジェクトがnew式の値になります。
この場合、thisの値であったオブジェクトは破棄されます。

return {a:1, b:2} のようにオブジェクトを返す場合の話。
 基本データ型の値をリターンする場合は、そのリターン値は捨てられる。

p.168
complexNumbers.sort(new function(a,b) { return a.compareTo(b); });
complexNumbers.sort(function(a,b) { return a.compareTo(b); });

p.171
例9-3 JavaScript クラスのサブクラス化の例(続き)
(誤)
// プロトタイプオブジェクトは、Rectangle()コンストラクタと一緒に生成され
// るので、

(正)
// プロトタイプオブジェクトは、Rectangle()コンストラクタによって生成され
// るので、

※ Since the prototype object was created with the Rectangle( ) constructor,
の「with」を「一緒に」と訳してしまうと意味が通じなくなる。

p.184
(誤)
for(var i = 0; i < borrows.length; i++) {

var c = data.borrows[i];
borrows[i] = c;
(正)
for(var i = 0; i < borrows.length; i++) {

var c = borrows[i];
※ defineClass 関数仕様には、引数オブジェクトの borrows プロパティには、
 「コンストラクタ関数、または、コンストラクタ関数の配列」が指摘できると書かれているが、
 修正前のコードでは、関数単体を指定することができない。
 例えば
    var PositionedRectangle = defineClass({

name: "PositionedRectangle",
...
borrows: [GenericEquals]
});
 は動作するが、
    var PositionedRectangle = defineClass({

name: "PositionedRectangle",
...
borrows: GenericEquals // 配列ではなく関数単体を指定した場合エラー。
});
 は動作しない。
 providesプロパティの指定方法も同様の仕様であり、そちらは問題なく動作したので、
 訂正後のコードは、provides の処理方法に合わせた。

p.227
(誤) java.math.BigDoubleまで含まれます。
(正) java.math.BigDecimalまで含まれます。

p.229
Swing GUIの起動方法が誤っている。
    public class Keys {


public static void main(String[] args) throws ScriptException, IOException
{
// スクリプトを実行するために「ScriptEngine」を取得する。
ScriptEngineManager scriptManager = new ScriptEngineManager();
ScriptEngine js = scriptManager.getEngineByExtension("js");

// スクリプトを実行する。実行結果は捨てる。ここで興味があるのは、
// スクリプト中で関数を定義することだから。
js.eval(new FileReader("listener.js"));

// Invocableにキャストして、KeyListenerを実装するオブジェクトを取得する。
Invocable invocable = (Invocable) js;
(修正) final KeyListener listener = invocable.getInterface(KeyListener.class);

// このKeyListenerをGUIで使用する。
(追加) SwingUtilities.invokeLater(new Runnable() {
(追加) public void run() {
JFrame frame = new JFrame("Keys Demo");
frame.addKeyListener(listener);
frame.setSize(200, 200);
frame.setVisible(true);
(追加) }
(追加) });
}
}
Swingの起動方法については以下の記事が参考になる。特に Java Tutorials の次の記述に注意。
Why does not the initial thread simply create the GUI itself? Because almost all code that creates or interacts with Swing components must run on the event dispatch thread.
なぜ、最初のスレッドが単純にGUI自体を作成しないのか、それは、Swingコンポーネントを作成するか、相互作用するほぼすべてのコードは、イベントディスパッチスレッド上で実行する必要があるためです。


Q4.3 SwingのGUIを起動する正しいやり方は?
http://homepage1.nifty.com/algafield/JavaGUIFaq19j.html#four3

The Java Tutorials — Creating a GUI With JFC/Swing > Concurrency in Swing > Initial Threads > Initial Threads
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

Java Tutorials Code Sample — HelloWorldSwing.java
http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start/HelloWorldSwing.java

p.333
(誤) この式では、DocumentオブジェクトのgetElementByTagName()を呼び出し、
(正) この式では、DocumentオブジェクトのgetElementsByTagName()を呼び出し、

※ getElementByTagName() → getElementsByTagName()。以下の訂正も同様。

p.333
(誤) "body"を引数にしてgetElementByTagName()を呼び出すと
(正) "body"を引数にしてgetElementsByTagName()を呼び出すと

p.333
(誤) HTMLタグでは大文字と小文字を区別しないので、getElementByTagName()に渡す文字列も大文字と小文字
(正) HTMLタグでは大文字と小文字を区別しないので、getElementsByTagName()に渡す文字列も大文字と小文字

p.334
(誤) さらに、HTMLドキュメントの場合は、HTMLDocumentオブジェクトにgetElementByName()メソッドも
(正) さらに、HTMLドキュメントの場合は、HTMLDocumentオブジェクトにgetElementsByName()メソッドも

※ getElementByName() → getElementsByName()

p.417
(誤) DOMレベル1では、すべてのドキュメント要素を操作可能にし、これらの要素で
(正) DOMレベル2では、すべてのドキュメント要素を操作可能にし、これらの要素で

p.419
(誤) ElementsとDocumentがこのインタフェースを実装し、
(正) ElementとDocumentがこのインタフェースを実装し、
※ Elements → Element

p.452
(誤) // Firefoxは e.charCode に印刷文字キーを格納し、IEは e.charCodeに格納する。
(正) // Firefoxは e.charCode に印刷文字キーを格納し、IEは e.keyCodeに格納する。

p.456
(誤) * などの基本型の値を指定する。data には、任煮のJavaScript値が指定できる。
(正) * などの基本型の値を指定する。data には、任意のJavaScript値が指定できる。
※ 任煮 → 任意

p.540
(誤) この例では、例21-6と同じようにXMLドキュメントをHTMLテーブルに変換します。
(正) この例では、例21-7と同じようにXMLドキュメントをHTMLテーブルに変換します。
※ 例21-6 → 例21-7

p.545
(誤) // この関数は引数として名前空間を受け取り、
(正) // この関数は引数として名前空間プレフィックスを受け取り、

p.588
(誤) この例では、makeVMLCanvas()関数とpiChart()
(正) この例では、makeVMLCanvas()関数とpieChart()

p.612
最下行
(誤) Packageオブジェクトから、
(正) Packagesオブジェクトから、



p.354
JavaScriptらしくないコーディング。

(オリジナル)
    // すべての見出しレベル用の節番号を結合して、

// [2.3.1]のような節番号を生成する。
var sectionNumber = "";
for (i = 0; i < level; i++) {
sectionNumber += sectionNumbers[i];
if (i < level - 1)
sectionNumber += ".";
}
(改訂案)
    // すべての見出しレベル用の節番号を結合して、

// [2.3.1]のような節番号を生成する。
var sectionNumber = sectionNumbers.slice(0, level).join(".");
以上

[正誤表] XMLとJavaによるWebアプリケーション開発 第2版 第2版第2刷 正誤表

 
CDの内容が次に示す原著のサイトからダウンロードできます。

XML and Java: Developing Web Applications, 2nd Edition
→ Downloads → CD Contents
http://www.informit.com/store/product.aspx?isbn=0201770040

以下、「XMLとJavaによるWebアプリケーション開発 第2版 第2版第2刷」で見つかった誤記です。
一部、補足めいたものもあります。

p.19
[誤記内容] 次の文に余計な改行が挿入されている。

  Well
  formedな文書を許すことによって

p.69
[誤記内容] 表3.1 において (Level 2) の書体が揃っていない。

p.75
MakeDocumentWithNS.java
final String NAMESPACE_SPEC

= "http://www.w3.org/2000/xmlns/";
→ 当該URLは javax.xml.XMLConstants のstatic定数 XMLNS_ATTRIBUTE_NS_URI で定義されている。

p.108
[誤記内容]
 図4.10 の 文書AのDOMツリー、文書BのDOMツリーの両方の図において、
 Element "second" の子要素が Text "Ichibanme" となっているが、
 正しくは Text "Nibanme" である。

p.114
(誤) Document doc = parser.getDocument());
(正) Document doc = parser.getDocument();

p.116
NamespaceCorrector.java
private static final String XMLNS_NS

= "http://www.w3.org/2000/xmlns/";
→ 当該URLは javax.xml.XMLConstants のstatic定数 XMLNS_ATTRIBUTE_NS_URI で定義されている。

p.119
NCTest.java
static final String XML_NS =

"http://www.w3.org/XML/1998/namespace";
→ 当該URLは javax.xml.XMLConstants のstatic定数 XML_NS_URI で定義されている。

static final String XMLNS_NS = "http://www.w3.org/2000/xmlns/";

→ 当該URLは javax.xml.XMLConstants のstatic定数 XMLNS_ATTRIBUTE_NS_URI で定義されている。

p.153
DOMConstructor.java
public static final String XMLNS_NSURI

= "http://www.w3.org/2000/xmlns/";
→ 当該URLは javax.xml.XMLConstants のstatic定数 XMLNS_ATTRIBUTE_NS_URI で定義されている。

p.211
表7.1 XPathの例
(誤) @type//email  文書ノードのtype属性を選択する。文書に含まれるすべてのemail要素を選択する。
(正) @type   文書ノードのtype属性を選択する。
   //email  文書に含まれるすべてのemail要素を選択する。

p.213
[誤記内容] 「表7.2 XPathの代表的な関数」 concat の説明に余計な改行が挿入されている。

p.229
「表7.4 スタイルシートの評価手順」の手順番号2の出力内容

(誤) <html><head>
   <title>XSLT
   sample 1

(正) <html><head>
   <title>XSLT
   Sample

 ※ sample 1 → Sample

p.239
(誤) 右側のコンポーネントのコンテンとハンドラ
(正) 右側のコンポーネントのコンテントハンドラ

 ※ コンテンと → コンテント

p.244
(誤) TransformerHandlerをXMLReaderに登録する。(2)
(正) TransformerHandlerをXMLReaderに登録する。(46行目)(2)

p.246
(誤) そのため、図7.5に示すように、JAXPのクラス(SAXParserFactory、SAXparser、
(正) そのため、図7.5に示すように、JAXPのクラス(SAXParserFactory、SAXParser、

 ※ SAXparser の p を小文字から大文字へ訂正。

p.255
下から3行目
(誤) 文脈館
(正) 文脈間

p.256
下から3行目
(誤) </title>...</boo>の間の変換である。
(正) </title>...</book>の間の変換である。

p.349
(誤) doPost()メソッドは、HttpServletRequest、HttpServletResponse、Documentの3つの
(正) doProcess()メソッドは、HttpServletRequest、HttpServletResponse、Documentの3つの

(誤) doProceess()メソッドの戻り値もまたDocumentであり、
(正) doProcess()メソッドの戻り値もまたDocumentであり、

p.360
パターン3では、状態はHttpSessionオブジェクトで保持する。この場合、同じセッションの間、同時に2つ
以上のHTTP要求が到着することはないので、
→ サーブレットの仕様では、同一のセッションであっても並行アクセスが発生するものとされてる。

p.360
結論として、要求のレベルに応じて、パターン1(HttpServletRequest)、パターン3(HttpSession)、
パターン5(データベース)を組み合わせることが簡単で安全な方法である。

→ パターン3については、自分でスレッドセーフする必要がある。

p.422
(誤) pathValueTbleで参照されるハッシュ表に格納する。
(正) pathValueTblで参照されるハッシュ表に格納する。

p.430
(誤) mekeIdxTbl()メソッドが実行される(109行目)。
(正) makeIdxTbl()メソッドが実行される(109行目)。
※ meke → make

p.436
(誤) /purchaseOrder[1]/items[1]/item[1]/purchaseOrder[1]/items[1]/item[2]の両方にマッチすべきである。
(正) /purchaseOrder[1]/items[1]/item[1]と/purchaseOrder[1]/items[1]/item[2]の両方にマッチすべきである。

p.437
[誤記内容]
リスト11.11 XMLDBServlet.java には、CDの内容と異なる誤ったソースコードが掲載されている。
その為、掲載されたコードと本文の説明がかみ合わない。
たとえば、本文では、XMLDBServlet は、GenericDOMServlet を継承しているものとして説明しており、
これは、CDの内容に沿っているが、下記のとおり本書に掲載されたコードはそうではない。

 掲載されたコード

  public class XMLDBServlet extends HttpServlet {

 CD

  public class XMLDBServlet extends GenericDOMServlet {


p.437
(誤) リスト11.11ではこのメソッドの中で、XMLTableArchiverのコンストラクタを呼び出し、
(正) リスト11.11ではこのメソッドの中で、XMLTableRetrieverのコンストラクタを呼び出し、

 ※ XMLTableArchiver → XMLTableRetriever

p.479
(誤) メソッドsetup()を呼び出して
(正) setup()メソッドを呼び出して
※ほかの箇所では、「setup()メソッド」と記している。

p.481
(誤) // create connectio and session
(正) // create connection and session

p.482
(誤) // create DOM for SOAM message and invoke the next
(正) // create DOM for SOAP message and invoke the next

 ※ SOAM → SOAP

p.501
(誤) String encodingStyleURI = args.length == 3
(正) String encodingStyleURI = args.length == 7

p.506
※ 以下、AttachmentPart であるべき箇所が Attachment art となっている。

(誤)
    Attachment art ap =

msg.createAttachment art(new DataHandler(url));
ap.setContentType("text/html");
// Add the attachment part to the message.
msg.addAttachment art(ap);


(正)
    AttachmentPart ap =

msg.createAttachmentPart(new DataHandler(url));
ap.setContentType("text/html");
// Add the attachment part to the message.
msg.addAttachmentPart(ap);


p.531
static public String XSD_NAMESPACE=

"http://www.w3.org/1999/XMLSchema";
→ URL "http://www.w3.org/2001/XMLSchema" が javax.xml.XMLConstants の
 Static定数 W3C_XML_SCHEMA_NS_URI に定義されている。



p.372-374
リクエストを受けたサーブレットから、転送先のJSPへデータを渡す場合、
通常、request オブジェクトを利用するのが、本書では、
Session オブジェクトを使用している。これでは、スコープが無駄に広くなり、
スレッドセーフに配慮しなければならないなどの問題がある。
以下は、それに関する訂正。

リスト10.16 BookStoreServlet2.java
  public final class BookStoreServlet2 extends GenericDOMServlet2

  ...
  {
    public void doProcess2(HttpServletRequest req,
    ...

      if ("addItem".equals(localName)) {
        ...
  p.373
  (旧)    session.setAttribute("result", array);
  (新)    req.setAttribute("result", array);
        ...
      }

      if ("order".equals(localName)) {
        ...
  p.374
  (旧)    session.setAttribute("result", array);
  (新)    req.setAttribute("result", array);
      }
p.374
(旧) 2.以下のように、HttpSessionオブジェクトにresultという名前で格納する。
    session.setAttribute("result", array);

(新) 2.以下のように、HttpServletRequestオブジェクトにresultという名前で格納する。
    req.setAttribute("result", array);

p.375
リスト10.18 addItemResponse.jsp
  <%@ page import="chap10.bookstore.ItemBean, chap10.EscapeString"

       contentType="application/xml; charset=utf-8"%>
  <jsp:useBean id="result"
         class="chap10.bookstore.BeansArrayBean"
(旧)       scope="session"/>
(新)       scope="request"/>
p.376
(旧)
このBeanの有効範囲はHTTPセッション(session)であることに注意してほしい。
これは、サーブレットがBeanを運ぶのにHttpSessionオブジェクトを使っていたことに対応している。

(新)
このBeanの有効範囲はHTTP要求(request)であることに注意してほしい。
これは、サーブレットがBeanを運ぶのにHttpServletRequestオブジェクトを使っていたことに対応している。

p.376
  <jsp:useBean id="result"

         class="chap10.bookstore.BeansArrayBean"
(旧)       scope="session"/>
(新)       scope="request"/>

以上。

[正誤表] Java GUIプログラミング Java SE6対応 Vol.I 初版第3刷 正誤表

 
以下、「Java GUIプログラミング Java SE6対応 Vol.I 初版第3刷」にて見つかった誤記です。

全般
本書の全てのサンプルコードが GUI の起動を main スレッドで行っているが、
これは、スレッド安全上危険なやり方である。
正しくは、以下のように invokeLater() メソッドによって起動する。
    public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowFrame();
}
});
}
private static void createAndShowFrame() {
JFrame frame = new JFrame("JFrame02");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
}
Swingの起動方法については以下の記事が参考になる。特に Java Tutorials の次の記述に注意。
Why does not the initial thread simply create the GUI itself? Because almost all code that creates or interacts with Swing components must run on the event dispatch thread.
なぜ、最初のスレッドが単純にGUI自体を作成しないのか、それは、Swingコンポーネントを作成するか、相互作用するほぼすべてのコードは、イベントディスパッチスレッド上で実行する必要があるためです。


Q4.3 SwingのGUIを起動する正しいやり方は?
http://homepage1.nifty.com/algafield/JavaGUIFaq19j.html#four3

The Java Tutorials — Creating a GUI With JFC/Swing > Concurrency in Swing > Initial Threads > Initial Threads
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

Java Tutorials Code Sample — HelloWorldSwing.java
http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start/HelloWorldSwing.java

p.2
したがって、サンプルプログラムJFrame01.javaのクラスは、JFrameを継承していることになる。
→サンプルプログラムの JFrame01 クラスは何も継承していない。

p.16
シャットダウンフックは、後から登録したものから先に呼び出される。
→ シャットダウンフックの呼び出し順序は規定されていない。登録したものは何らかの順序で並行して実行される。
Runtime クラスの addShutdownHook メソッドについて Javadoc には次のように書かれている。

When the virtual machine begins its shutdown sequence it will start all
registered shutdown hooks in some unspecified order and let them run concurrently.
仮想マシンがシャットダウンシーケンスを開始すると、すべての登録済みシャットダウンフックを、
指定されていない順序で起動し並行して実行します。

p.18

■シャットダウンフックを指定したときには、このような順序で呼び出される
→ 呼び出し順序は規定されていない。さらに登録したものは並行して実行されるため、
呼び出し順序と出力結果の順序は必ずしも一致しない。

p.28
contentPane.setToolTipText("ContentPane は Swing コンポーネントです");
→ サンプルコードとして書式スタイルが設定されていない、行の下に水平線がない。

p.34
レイアウトマネージャーに関しては、別巻で詳しく取り上げる。
→ 具体的にどの巻か? vol. の目次にはそれらしいのが見当たらない。

p.54
誤:label1の東側とlabel1の西側が向き合うので、Label1の右側にLabel2が位置することになる。
正:label1の東側とlabel2の西側が向き合うので、Label1の右側にLabel2が位置することになる。
※label1の西側 → label2の西側

p.66
ImageLabel02.java
    public int getIconWidth() {

return this.width;
}
public int getIconHeight() {
return this.height;
}
→ 動作はするが、width, height は静的変数なので
this.width を width または DrawIcon.width にするか、
もしくは、width をインスタンス変数にするべき。
height についても同様。

p.67
誤:この例では、アイコンは幅・高さともに32ピクセルで、赤く塗りつぶした円が描画される。
正:この例では、アイコンは幅・高さともに100ピクセルで、緑色で塗りつぶした円が描画される。
※ 32ピクセル→100ピクセル、赤く→緑色

p.90
MenuTest05.java
    //System.out.println( e );
→ 下から7行目の行が余計。
//System.out.println( e ); //イベント内容を出力する
などのコメントを付加するか、この行を削除した方が良い。

p.96
ImageButton02.java
    public TestIcon() {

誤) color = Color.red;
正) color = Color.white;
}
p.96
ImageButton02.java
    public int getIconWidth() {

return this.width;
}
public int getIconHeight() {
return this.height;
}
→ 動作はするが、width, height は静的変数なので
this.width を width または DrawIcon.width にするか、
もしくは、width をインスタンス変数にするべき。
height についても同様。

p.127
誤:<br>タグは単なる改行にだけでなく、パラグラフ指定の意味もある。
正:<p>タグは単なる改行だけでなく、パラグラフ指定の意味もある。
※<br> → <p>,
改行にだけでなく → 改行だけでなく

p.131
Html10.java
frame.setDefaultCloseOperation(3); // EXIT_ON_CLOSE
次のように修正するべき。
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
以下のページについても同様。
p.133 Html10A.java
p.137 Html11.java
p.141 Html12.java
p.144 Html13.java
p.146 Html14.java
p.149 Html15.java
p.153 Html16.java
p.156 Html16A.java
p.160 Html17.java
p.162 Html18.java

p.154
■JTabbedPane でHTML指定
→ 掲載された図には JLabelオブジェクト month が表示されていない。
アプリケーション起動後、いずれかのタブを選択し、
month を表示させてから、ハードコピーを取ると以下のようになる。
Html16 表示結果差し替え版

p.158
■タブが表示される位置を変えられる
→ 掲載された図には JLabelオブジェクト month が表示されていない。
アプリケーション起動後、いずれかのタブを選択し、
month を表示させてから、ハードコピーを取ると以下のようになる。
Html16A 表示結果差し替え版

p.177
誤:ラジオボタンは、Contentpaneに追加するだけでなく、ButtonGroupにも追加する。
正:ラジオボタンは、ContentPaneに追加するだけでなく、ButtonGroupにも追加する。
※ Contentpane → ContentPane

p.216
    if (label == 'C') {

field.setText("");
(追加) arg = "";
opeCode = '+';
arg1 = 0;
lastTimeNum = false;
System.out.println("arg1:" + arg1);
return;
}
※ 元のコードには以下のようなバグがある。
【バグ内容】電卓の C ボタンを押した際、バッファ arg をクリアしていないため、
C ボタンでテキストフィールド上の数字をクリアしても、
再び数字を打ち始めると、それまで打った内容が復活してしまう。

p.282
誤:メッセージボックスはshowMessage Dialog()メソッドを使って生成する。
正:メッセージボックスはshowMessageDialog()メソッドを使って生成する。
※ showMessage Dialog() → showMessageDialog()

p.283
→ この章のほかの図とは違い「■最も単純なメッセージボックス」のハードコピーだけ、
メッセージボックスのみが含まれ、メインウィンドウが含まれていない。

p.284
第1引数の説明の4行目の「代引き数」は、「第1引数」の誤記であると思われる。

p.308
[取消し] ボタンが押された場合には、nullが返される。
→ この文は、「6-7 JOptionPaneの中にコンポーネントを置く」の1行目の文となっているが、
「6-6 コンボボックスを持つダイアログボックス〜」の最後の1文であるべき。

p.309
DialogTest07.java の実行結果が「■JOptionPaneには、さまざまなコンポーネントを置ける」の図と一致しない。
図を修正するか、DialogTest07.java を以下のように修正する必要がある。
サンプルコードを以下のように修正する場合には、p.310 のコード解説にあるコードも修正が必要となる。
        public void actionPerformed(ActionEvent e) {


String[] choice = { "One", "Two", "Three" };
JList li = new JList(choice);

(追加) JRadioButton rb = new JRadioButton("ラジオボタン", true);
(追加) JCheckBox cb = new JCheckBox("チェックボックス", true);

(修正) Object[] option = {li, rb, cb};
int ans = JOptionPane.showConfirmDialog(pane, option,
"JOptionの中でJListが使える",
JOptionPane.OK_CANCEL_OPTION);
System.out.println(li.getSelectedValue());
(追加) System.out.println(rb.isSelected());
(追加) System.out.println(cb.isSelected());
}
p.319
誤:String[] extensions = { "gif", "jpg" };
正:String[] extensions = { ".gif", ".jpg" };

※ 訂正後のコードは、gif, jpg の前にドットを付加。
元のコードでは、「jjjjpg」のようなファイル名で
拡張子のないファイルも表示されてしまう。

p.321
誤:String[] extensions = { "gif", "jpg" };
正:String[] extensions = { ".gif", ".jpg" };
※ 訂正後のコードは、gif, jpg の前にドットを付加。

p.324-p.325
JListTest01.java の実行結果が「■JListの最も基本的な例」の図と一致しない。
図、または、サンプルコードを修正するか、その両方を修正する必要がある。
図に合わせサンプルコードのみを修正する場合、コードの修正内容は以下のとおり。

String[] choice = { "Lisp", "C++", "Smalltalk", "Java" };

String[] choice = { "1111", "2222", "3333", "4444", "5555", "6666", "7777", "8888" };

サンプルコードを修正する場合には、p.325 のコード解説に再掲されたコードも修正が必要となる。

p.338
String[] choice = { "1111", "2222", "3333", "4444", "5555" };
をコンストラクタ内のローカル変数ではなく、JListTest03A のインスタンス変数として定義すべき。
そうしないと、同ページ内にある次のコメント行を有効にした場合、コンパイルエラーが発生する。
それか、このコメント行を削除すべき。
// String select = choice[selectNo];

p.347
JListTest03.java で使われている getValueIsAdjusting()メソッドの説明がない。
→ getValueIsAdjusting() は、p.340 の「●getValueIsAdjusting()〜選択状態が確定したか」で
説明されているが、初出のここで説明するべき。

p.354
誤:String[] choice = { "Java", "C", "C++", "SmallTalk", "Lisp", "Prolog", "Pascal" };
正:String[] choice = { "Java", "C", "C++", "Smalltalk", "Lisp", "Prolog", "Pascal" };
※ Smalltalk の t は小文字。

p.356, p.358 にも同様の訂正が必要。
それに加えて以下のハードコピーも訂正が必要。
(p.356) ■ListModelを使っていると、項目名を変更できる
(p.360) ■変更・追加・削除ができるようにする

p.357
誤:[Java, C, C++, SmallTalk, Lisp, Prolog, Pascal]
正:[Java, C, C++, Smalltalk, Lisp, Prolog, Pascal]

p.357
「●JListからDefaultListModelを取り出す」のコード解説に再掲されるサンプルコード

JList list = (JList) e.getSource();
System.out.println(list.getModel());

→ System.out.println(list.getModel()); は、
 「●DefaultListModelの内容をダンプする」で解説済み。
 次のコードの方が解説内容に合致する。

DefaultListModel model = (DefaultListModel) list.getModel();

p.360
誤:int ans = JOptionPane.showOptionDialog( frame, obj, "Edit List",
正:int ans = JOptionPane.showOptionDialog( frame, obj, "リスト内容の変更",

p.360
誤:ダイアログボックスに複数のボタンを置くのに、JOptionPane.showOption Dialog()を使う。
正:ダイアログボックスに複数のボタンを置くのに、JOptionPane.showOptionDialog()を使う。
※ showOption Dialog() → showOptionDialog()

p.365
最後の一文
誤:やはり、不透明表示を指示する必要がある。
正:不透明表示を無効にする必要がある。

p.369
誤:それを行うには、独自のList SelectionModel
正:それを行うには、独自のListSelectionModel

p.370
誤:Shiftキーを押さずに、ただ単に項目を連続敵に
正:Shiftキーを押さずに、ただ単に項目を連続的に
※連続敵 → 連続的

p.371
1行目
誤:コンポーネント内の各項目をどのように表示するかを
正:コンポーネント内の各項目をどのように選択するかを
※どのように表示するか → どのように選択するか

p.392
PrimeNumbersTask クラスを以下のように修正するべき。
PrimeNumbersTask のコンストラクタは
JTextArea の引数を取っているので、
それをインスタンス変数に保存するべき。
あるいは、コンストラクタの引数から textArea を削除するか。
    class PrimeNumbersTask extends SwingWorker<List<Integer>, Integer> {

int current = 1;
int numbersToFind = 1;
(追加) JTextArea textArea = null;
public PrimeNumbersTask(JTextArea textArea, int n) {
numbersToFind = n;
(追加) this.textArea = textArea;
}
...
p.392
2は素数だから IsPrimeにおいて n が2の場合 false を返すのは間違い。
    private boolean IsPrime(int n) {

int i = 0;
if (n < 2) return true;
(誤) else if (n == 2) return false;
(正) else if (n == 2) return true;
if (n % 2 == 0) return false;
for (i = 3; i * i <= n; i += 2)
if (n % i == 0) return false;
return true;
}
p.392, p.395
Java の慣習に従い、以下3箇所の IsPrimeメソッド名を isPrime に直すべき。
(p.392) private boolean IsPrime(int n) {
(p.392) b = isPrime(++current);
(p.395) private boolean IsPrime(int n) {

以上