Valid HTML 4.0!

[HOME][目次][FILES][Q&A]
[正誤表]
ひとつ上をゆくJavaの教科書

Running Snake Legs

updated: 060529

  蛇足(snake legs)は、あとから付け足した無駄なもののたとえですが、でも蛇自身は、自分にも足があって野兎のように素早く走れたら(running)いいなあと思うでしょうね、きっと。そこでこのページには、みなさまのJavaプログラミングをより一層快速にするための追加情報を、思いつくたびに書き足していきます。

  なお、このページの最下部に本書の[正誤表]を設けましたので、面倒をおかけして恐縮ですが内容をあなたのお手元の本書に転記してください。



6. 10-4-6-(4) GUIのフリーズ防止の復習

  この問題と対策には、今から慣れておいたほうがよいと思われるので、簡単な復習素材を設けました。[この練習プログラム]を改良して、マウスから指を放すとコンソール画面への文字出力が停止するようにしてください。(051008)


5.Javaの剰余演算子は浮動小数点数にも使える

  この話題は[正誤表]であっさり済ませられる簡単な話題ではないので、ここに書かせていただきます。本書4-4-2(114ページ下)では、剰余演算子%は整数タイプに対してだけ使える、と書きましたが、それは実は、私の古巣C/C++言語のルール。Javaでは小数部のある数(浮動小数点数)に対しても使えます。ただし、その結果は、浮動小数点数の国際標準規格(IEEE 754)が定めている、いわゆる“標準的な正しい”値ではありませんから、やはり、%演算子は整数に対してだけ使う、と記憶しておいたほうが、今後のプログラミングのためには安全かもしれません(参考文献:Java言語仕様(通称JLS)15.17.3)。[参考プログラム]
  この問題に限らず、コンピュータの上の擬似的な実数表現である浮動小数点数は、あなたの算数の常識とは違う演算結果を出すことがひんぱんにありますから、小数部の精度が重要なプログラミング課題では気をつけてください。

4.コンパイル(compile)という言葉の意味

  本書10ページの、コンパイル/コンパイラという言葉の説明に、ちょっとsnake legsを付けましょう。コンパイラは、複数のソースファイルをコンピュータの命令に翻訳して、ひとつのアプリケーションや大きな部品単位へまとめる仕事もします(プログラミングの古き悪き時代にはこの仕事をリンカ(linker,連結係)という別のプログラムが担当した)。今日ではコンパイルの意味に、こういった“全体まとめ作業”も含まれていると理解すべきでしょう。248ページや337-338ページ(7-4-1)で説明している“解決”という仕事も、コンパイラが行う全体まとめ作業の重要な一部です。


3. 無引数のコンストラクタをプログラマが書かなければならない場合

  この問題は、6章の6-8-1「デフォルトコンストラクタ」のところで説明しています。文章を読んだだけでは内容が脳に深く刻印されない、私(岩谷)に似たタイプの読者は、ここで提供する四つのサンプルプログラムをコンパイルして、このルールを実体験してください。

  クラスSubcがスーパークラスSupercを継承(extends)するとき、Subcにコンストラクタがなかったら自動的に提供されるデフォルトコンストラクタの中で、または、Subcにコンストラクタがあってしかしそれらの中に明示的にsuper();やsuper(引数);の呼び出しが書かれていなければそれらのコンストラクタの中で、JavaはSubcのオブジェクトのスーパークラス部分を造るために自動的にsuper();すなわちスーパークラスの無引数のコンストラクタを呼び出します。

  したがって上の場合には、Javaが自動的に呼び出すsuper();の呼び出しが成功するために。スーパークラスSupercに無引数のコンストラクタがある必要があります。

  Supercにコンストラクタがまったく書かれていなければ、デフォルトコンストラクタすなわち無引数のコンストラクタが自動的に提供されるので、この問題は自動的にクリアされます。[このソースファイル]をダウンロードしてコンパイルすると、コンパイルはすんなり成功するでしょう。

  しかしSupercにコンストラクタが一つでも書かれていると、デフォルトコンストラクタ(無引数のコンストラクタ)は提供されないので、Subcによるextendsが成功するためには、Supercに無引数のコンストラクタを書く必要があります。[このソースファイル]は、スーパークラスに無引数のコンストラクタがないので、コンパイルはエラーに終わるでしょう。

  [このソースファイル]のように、スーパークラスに無引数のコンストラクタをちゃんと書けば、コンパイラはなにも文句を言いません。

  さらにまた、サブクラスのコンストラクタの中で、Javaによるsuper();の自動的な呼び出しにまかせずに、プログラマが明示的にスーパークラスのコンストラクタ、それも引数を取るコンストラクタを呼び出せば、無引数のコンストラクタうんぬんという問題そのものが、最初から存在しなくなります。[このソースファイル]をダウンロードし、コンパイルしてみれば、結論のあっけなさをどなたも実感できるでしょう。

#####    --------------------------------------------------------------------    #####
  ただしジャバビーンズ(JavaBeans)と呼ばれる規格に従ったクラスが要請されるJava応用システム…最近はとても多い…では、継承(extends)とは無関係に、なにがなんでも無引数のコンストラクタが必要です(それは、Javaが自動的に提供するデフォルトコンストラクタでもよい)。それらのクラスのオブジェクトは、プログラマが作るというより、システム側が作ることが多く、フィールドの値やオブジェクトの状態を表す値(あわせて“プロパティ”と呼ぶ)へのアクセスはsetXxx(), getXxx()メソッド(アクセッサメソッド、セッターメソッド/ゲッターメソッド)をもっぱら使うからです。コンストラクタにフィールドの初期値などを引数として渡す必要がない、だから無知な外部システムでも、オブジェクトを作るために一律に無引数のnew Boo();を呼べばよい、これが、ビーンの設計者の魂胆でしょう。
#####    --------------------------------------------------------------------    #####


2. 複数のソースファイルから成るプログラムのコンパイル

  たとえば3つの.javaファイル、main()メソッドのあるAaa.javaと、Bbb.javaと、Ccc.javaから成るプログラムを書きました。AaaクラスはBbbオブジェクトをnewして使っていますし、BbbオブジェクトにはCccオブジェクトのフィールドがあります。さらにCccオブジェクトはAaaオブジェクトの参照をコンストラクタがもらっています。このように複数のファイルのあいだに互いの参照/利用関係があるときには、ファイルを個々にコンパイルすると「シンボルが見つかりません」エラーをコンパイラからもらいます。こんなときには、main()メソッドのあるファイルだけを、次のようにコンパイルします:
javac Aaa.java
これだけで、Aaa.java, Bbb.java, Ccc.javaの3つが自動的にコンパイルされます。7章7-4-2-(4)「ソースコード優先」の項の冒頭部分をもう一度読んでみてください。


1. 配列をnewしただけでは、中身はまだnull!

  Javaでは、配列もオブジェクト(ただし、不思議なことにクラスの定義がない!)ですから、new文で作ります:
Account[] accounts = new Account[number]; //numberはintです. longタイプは使えません.
  しかしここで、かなりの数の初心者が、配列を作ったら同時にその成分のオブジェクトも作られている、と錯覚します。そこで、次のような文を書いて:
Account[0].setName("宮本武蔵");
ランタイム(実行時)に見事にNullPointerExceptionを食らいます。コンパイラには残念ながら、オブジェクトの参照がnullであることのチェックはできません(その理由を今夜の寝床の中で考えてみましょう)。
  配列を作ったら、必ずその中身も初期化することを、忘れないようにしましょう。たとえば:
for (int i = 0; i < accounts.length; ++i){
   acounts[i] = new Account();
}
  なお、intなどプリミティブタイプの配列の成分の値は、配列をnewした時点では、その配列がクラスのフィールドなら0 (booleanタイプではfalse)、メソッドのローカル変数なら不定です。



[TOP]

正誤表の内容をお手元の本書に転記してください。
□正□誤□表□(赤字で示す下線部分が変更箇所を示します)
--080121更新--[最新項目]

[pxviii, 6行]☆この項は本書に転記しなくてもかまいません。ざっと読んでください。
 誤  実行をしてください。
 正  実行をしてください(それを面倒に感じる人は全ファイルを一つのディレクトリに置いてもかまいません)

[pxviii, 7行]
 誤  Fedora3
 正  Fedora Core 3

[p15 下1行]--new050901--
 誤  図0−とまったく
 正  図0−とまったく

[p20 下8行]☆この項は本書に転記しなくてもかまいません。ざっと読んでください。
 誤  指定したディレクトリです。
 正  指定したディレクトリ、またはインストーラやRPMが事前に設定しているデフォルトのディレクトリです。

[p22 8行]
 誤  エディタ名前
 正  エディタ名前

[p32 下2行]--new051214--
 誤  入力したjavacコマンドを
 正  入力したjavacコマンドを

[p63 下14行]【閉じブレース欠落】--new051120--
 誤      red = green = blue = 255;
  
 正      red = green = blue = 255;
}

[p63下9行]【行の字下げ】
 誤  blue = b;
 正      blue = b;

[p93 11行]【Javaのエスケープシーケンス】
 誤  \0xx  1バイトの値を8進数文字で指定    (\u0000から\Zu00ffまで)
 正  \0xx  1バイトの値を8進数文字で指定    (\u0000から\u00ffまで)

[p93 下8行]【8進数とはなんでしょうか?】--new051028--
 誤  7+(7×8)+((7+(7×8))×3)=255
 正  7+(7×8)+(3×(8×8))=255

[p100 上6行]--new060520--
 誤  satic, すなわち
 正  static, すなわち

[p114 下1行]--new050827--
 誤  剰余演算子は, 整数タイプに対してだけ使えます。
 正  !!!! 正しい記述は[この記事]を読んでください !!!!

[p116 10行]
 誤  a != 2
 正  a != b

[p123 6行]
 誤  忘れてしまうことがあります!。
 正  忘れてしまうことがあります!。

[p131 下5行]--new050825--
 誤  OptionFla =
 正  OptionFlag =

[p132 下9行]--new050928--
 誤 
 正  4-2(125ページ)

[p151 下10行]--new050911--
 誤  bolean flag = !boo;
 正  boolean flag = !boo;

[p156 3行]重要用語の初出なので、英語を併記します。
 誤  Javaの用語で“参照”といいます。
 正  Javaの用語で“参照(reference)”といいます。

[p156 6行]オブジェクトとその参照の違い/区別をはっきりさせます。--new080219--
 誤  元々それがローカル変数
 正  元々はその参照がローカル変数

[p157 下6行]
 誤  もう少しあとで説明します。
 正  もう少しあとで説明します(183ページ下)

[p159 下3-1行]
 誤  a++ //増値1
 正  ++a //増値1
 誤  ++a //増値2(事後増値(pre-decrement))
 正  a++ //増値2(事後増値(post-increment))
 誤  事前減値(post-increment)
 正  事前減値(pre-decrement)

[p160 9-10行]--new050901--
 誤  sたは減らしながら
 正  または減らしながら

[p168 4行]
 誤  オブジェクトタイプが等しいこと
 正  オブジェクトタイプが等しいこと

[p172 下6行]正しいLeapYear.javaの場所
 誤  http://hpmboard1.nifty.com/cgi-bin/thread.cgi?user_id=HGA03630
 正  http://homepage1.nifty.com/algafield/jpr/srcs/

[p183, 11行]
 誤  本書のお助け掲示板, に遠慮なく
 正  本書のお助け掲示板に遠慮なく

[p183 下5行]--new060520--
 誤  たとばこのように
 正  たとばこのように

[p184, 上図]図の最上部の1行が切られています(関連プログラム)。
 誤 
    ***    
   *****   
  *******  
 正 
     *     
    ***    
   *****   
  *******  

[p207, 1行]
 誤  new MyClassA();
 正  new MyClass();

[p223, 5行]
 誤  public abstract MyClass
 正  public abstract class MyClass

[p231, 下15行]--new050825,行番号訂正(5→15)050901--
 誤  jara.awt.eventパッケージ
 正  java.awt.eventパッケージ

[p239, 下3行]
 誤  自動スクロールをせない
 正  自動スクロールをせない

[p247, 2行]
 誤  インタフェイスや象徴クラスを
 正  インタフェイスや抽象クラスを

[p258, 下10行]
 誤  “キャストする”ことによって下のコラム参照),
 正  “キャストする”ことによって(下のコラム参照),

[p258, 下7行]
 誤  (10, 11)
 正  (10)

[p263, 5行]--new050825--
 誤  インタフェイスの中メソッドは
 正  インタフェイスの中メソッドは

[p265, 下16行]--new050825--
 誤  スーパークラスのpublicでないメソッドを
 正  スーパークラスのprivateでないメソッドを

[p266, 下7行]
 誤  ローカ変数
 正  ローカ変数

[p269, 17行]--new050918--
 誤  lightgray
 正  lightGray

[p274, 下6行]
 誤  ややわかりづらくなこともあります
 正  ややわかりづらくなこともあります

[p290, 3行]
 誤  6-8-1 複数のコンストラクタの書き方/this()とsuper()
 正  6-8-2 複数のコンストラクタの書き方/this()とsuper()

[p294, 2-3行]コメントと対象行の位置関係([Child.java]を見てください)
 誤  //クタは提供されないなにかの処理
 正  //クタは提供されない
 誤  12
 正  12        //なにかの処理

[p294 図6-10説明文]--new060520--
 誤  作った, らその中に
 正  作ったらその中に

[p296, 4行]
 誤  どこかあるのでしょうか?
 正  どこかあるのでしょうか?

[p305 下10行]--new060529--
 誤  4-2-2
 正  5-2-2

[p330, 14行]--new050825--
 誤  キャスする
 正  キャスする

[p330 下6行]--new060529--
 誤  Strigならば
 正  Stringならば

[p335, 下14行] 折りたたみ行の字下げ([PassedObject.java]を見てください)
 誤  System.out.println("メソッド内:最初の状態= "
+ bt1.getText() + " " + bt2.getText());
 正  System.out.println("メソッド内:最初の状態= "
  + bt1.getText() + " " + bt2.getText());

[p336, 3行] 折りたたみ行の字下げ([PassedObject.java]を見てください)
 誤  System.out.println("呼び出し側:最初の状態= "
+ bt1.getText() + " " + bt2.getText());
 正  System.out.println("呼び出し側:最初の状態= "
  + bt1.getText() + " " + bt2.getText());

[p345, 11行]--new050901--
 誤  必ず含めるようにしましょう。
 正  必ず含めるようにしましょう。

[p348, 14行]
 誤  考えずにすみます。
 正  考えずにすみます(10-1-(2))

[p356, 14行]
 誤  前の7-6節で
 正  前の7-5節で

[p357 下16行]--new060529--
 誤  6-5-2
 正  6-5-3

[p359, 4行]--new050825--([SaveObject.java]を見てください。)
 誤  new ObjectInputStream(new FileInputStream(fileName));
 正  = new ObjectInputStream(new FileInputStream(fileName));

[p364, 下2行]
 誤  9章(9-3-2-1)のコラム
 正  9章(9-3-1-2)のコラム

[p369, 下2行, 下7行(計2箇所)]--new050826--
 誤  つのリンク
 正  つのリンク
注:英語版や, 日本語版1.5は, [Search]/[検索]があり計6つです。

[p370, 下10行]--new050826--
 誤  /docs/tooldocs/ja/tools.html
 正  /docs/ja/tooldocs/tools.html

[p382, 15行]--new050826--
 誤  Strint str = .....;
 正  String str = .....;

[p383, 12, 15, 22行(計3箇所)]
 誤  Witer
 正  Writer

[p383, 下14, 12行(計2箇所)]--new080121--
 誤  BuffereReader
 正  BufferedReader

[p386, 7行]例外クラスの正しい名前
 誤  ArrayIndexOutOfBounds
 正  ArrayIndexOutOfBoundsException

[p391, 2行]--new050827--
 誤  any ket to continue
 正  any key to continue

[p399, 13行, 下7行(2箇所)]--new050827--
 誤  selector
 正  Selector

[p411, 7,13,18行(計3箇所)](この<参考プログラム>を見てください。)
 誤  s.indexOf(s, i + 1)
 正  s.indexOf(c, i + 1)

[p413, 下6行]--new050921--引数の順序が逆です: この<参考プログラム>を見てください。
 誤  int yon2 = s.indexOf(yon + p.length(), p);
 正  int yon2 = s.indexOf(p, yon + p.length());

[p425, 2行]必要不可欠な"が2つ消えています(RegexTest.java)。
 誤  <a href=\http
 正  "<a href=\"http

[p426, 下5,8,12行(計3箇所)]--new050830--
 誤  http:://
 正  http://

[p430, 2行]
 誤  ine
 正  int

[p434, 下8行] コメントと対象の位置関係
 誤                                      //小数点以下2桁四捨五入
BigDecimal d = y.divide(r, 2, BigDecimal.ROUND_HALF_UP);
 正                           //小数点以下2桁
BigDecimal d = y.divide(r, 2, BigDecimal.ROUND_HALF_UP); //四捨五入

[p461, 下12行]
--new050902--
 誤  何かのコンポーネント上を
 正  何かのコンポーネント上を

[p463, 6行]
--new050902--
 誤  (layout manager)」呼ばれる
 正  (layout manager)」呼ばれる

[p467, 9-10行]
 誤  多層的に持っている
 正  多層的に持っている

[p496, 下4行]
 誤  getMouseModifiersTex()
 正  getMouseModifiersText()

[p504, 2-3行]
--new050902--
 誤  うまくできなくります
 正  うまくできなくります

[p505, 14行]
 誤  から5つ目のアイコン
 正  から5つ目のアイコン

[p506, 11行]
 誤  右からつ目
 正  右からつ目

[p509, 6行]
 誤  左からつ目
 正  左からつ目

[p518, 図10-16の注記]
 誤  kissy.jpg
 正  kissy.png

[p534, 14行]
 誤  右からつ目
 正  右からつ目

[p537, 下7行]
 誤  Default Table Model
 正  DefaultTableModel

[p585, 左下12行]
 誤  initilalizer
 正  initializer

[TOP]