title
ilサポート情報

何気にロングセラーとなっている池田の初めての著作です。各種の大学・専門学校の先生方、採用ありがとうございます。

改訂版について

・J2SE 5.0で追加された文法事項の一部(本書の趣旨に即して選んであります)を解説した補講を追加しました。
・組版を改め見やすくなりました。
・初心者にとっての難関であるパスの設定についての説明を追加しました。
・初版の誤植、ミスの訂正をしました。

追加情報

Javaのインストール時にやっかいなパス設定についての解説です。なおこの情報は改訂版では付録として収録されています。

WindowsXPでのパス設定方法
Windows2000でのパス設定方法

Windows95/98/98SEをお使いの方へ
製造販売元でもあるマイクロソフト社でもサポートを終了しておりますので、AUTOEXEC.BATを編集する方法については説明致しません。あらかじめご了承ください。


読者のK.H様より以下の質問をいただきました。

第13講の「FirstProgram.java」においてコンパイルには成功し、「FirstProgram.class」までの作成は出来たのですが、
java FirstProgram
のコマンドを実行すると「Exception in thread "main" java.lang.NoClassDefFoundError: FirstProgram」というメッセージが出て「This is a pen.」を表示することが出来ませんでした。そこでネットを調べた結果
java -cp . FirstProgram
を実行すると「This is a pen.」を表示することが出来ましたが、
「java FirstProgram」のコマンドと「java -cp . FirstProgram」との違いが今一理解できません。

通常コンパイルができないという質問が多いのですが、大半は前述のパスの設定が問題です。なぜ自動でインストール時にしてくれないのか?筆者はその理由は大体予想できてるのですが、話すと長くなりますので今回は省略します。そんなわけで、とうぶんはパス設定はしなければいけない作業となります。
さて、質問の回答ですが、結論から申し上げるとこの現象を説明しているのが、p200の第37講です。この講ではクラスパスという新たなパス設定の説明があります。このパス設定もJavaコマンドのパスを設定するのと同様で環境変数です。そして、その名前は「CLASSPATH」です。この環境変数は、実行するクラスファイル(=コンパイルして生成されるxxx.classファイル)の位置を指定します。

そこで、大事なのが、p203でも色分けで強調されていますが、このCLASSPATH環境変数を設定していない場合は、クラスファイルの存在される場所
はカレントディレクトリであると見なされます。実行する以上はどこらかしらに場所を定めないといけませんのでこのようなルールになっています。この点は、まず合理的だとは思います。

それを踏まえて推論すると、質問にあった現象は、「自分で設定していないのに誰か(=何らかのアプリケーション)がクラスパス(CLASSPATH環境変数)を設定してしまっている」という可能性が一番高いものと考えられます。

コントロールパネルを使わなくてもCLASSPATH環境変数の設定がされているかを調べるには、コマンドプロンプトで「set」コマンドというのを実行してみてください。「set」だけ入力して、エンターキーを押します。するとずらずらと、設定されている環境変数が表示されます。それで「CLASSPATH=xxxxx」という記述があると思います。もしないとすると、より複雑なケースなので個別にトラブルシューティングをしなければいけません。

そして、予想通り先約で設定されていた場合は対応策は2つあります。

(1)K.Hさんのように「-cp」あるいは「-classpath」オプション(両者の機能は同一です)を用いてクラスパスを決め打ちで明示的に設定する
 
「-cp . ピリオドはカレントディレクトリを意味します。つまり、CLASSPATH環境変数の設定を無視してオプションで指定されたクラスパスを利用します。また、セミコロンで区切れば複数のパスをクラスパスとして利用できます。
この場合は都度クラスパスを指定しますので、CLASSPATH環境そのものには影響は与えません。
 
(2)CLASSPATH環境変数を変更する。

Javaコマンドのパス指定と同じ方法で設定します。今回のポイントは、

C:¥Program File¥xxx()¥;C:¥Program File¥xxx()¥;C:¥Program File¥JavaAPP¥
となっていたら、
. ;C:¥Program File¥xxx()¥;C:¥Program File¥xxx()¥;C:¥Program File¥JavaAPP¥
のように頭に追加してください。また、既存の設定は変えないようにしてください。インストールされているアプリケーションが動かなくなります。

池田としてはいくつかのアプリケーションでJavaを使っているケースは把握していたのですが、それほど多くの人が使っているとは思っておりませんでした。ですが、K.Hさんとのメールのやりとりで、意外なところで Javaの出番があるアプリケーションがありました。しかも結構な数の方が使っています。

そのアプリケーションはiPodとペアで使うiTunesです。

iTunesをインストールすると QuickTimeもインストールされます。Macでは当たり前のように使われるQuickTimeですが、iTunesを使う場合では、Windowsでも積極的に活用されます。ただ、具体的にJavaをどのように使っているのかは確認を取っていません。他にも最近はパッケージソフトでもJavaを使うケースが増えているという話も耳にしましたので、基本的には、すでにある設定は削らないで、自分が必要なパスを追加するということにすれば問題ないと思います。

初めてのコンパイル&実行のタイミングで、結構後ろに載っている知識が必要になってしまうので頭が混乱してしまうかもしれません。ひとまず、理屈は置いておいて必要作業として最初は考えてください。いずれその理屈も理解できる時が来るでしょう。

最後になりますが、情報提供いただいたK.H様に改めて御礼申し上げます。




正誤情報

申し訳ありませんが、本文の訂正をさせていただきます。
以下の訂正は改訂版では修正されています。

・第18講のp94
論理演算子の説明のところで大きな誤りがありました。読者のKさん、本当に有り難うございます。(本人の了解を得ていないのでイニシャルで今は御紹介しております。)
適切な表現は以下の通りです。
 
&&&|||の違いがわかりづらいですね。これらの違いは&&||は左辺の値を調べたときに全体の結果がわかるなら、右辺の値は見ずに結果を決めてしまいます。&&は左辺がfalseのとき、||は左辺がtrueのとき、右辺の値に関わらず結果が判明します。これは、東京ドームで巨人戦をしているときに巨人が勝っていれば9回裏は行われずに試合終了になってしまうのと同じで、やっても無駄なのでやらないという方針です。どちらを使おうと最終結果は変わりませんが、&&||を使った場合は可能性として実行速度が速まることが期待できます。
赤字のところが訂正した箇所です。この記述のちょうど上にある表18-1の記述と全く逆の記述になってしまっていました。結果としては表18-1の内容が正しいです。お詫びして訂正申し上げます。ちなみに&&と||の評価の仕方を短絡評価と呼びます。ここから転じて&&と||の演算子のことをショートカット演算子と呼ぶこともあります。
以下の訂正は初版第2刷(及び改訂版第1刷)では修正されています。

・第49講のp278の下から4行目
×
それと内部クラスを制限する・・・
○それと内部クラスを宣言する・・・
です。

読者の方からのご指摘です。

p170から始まるリスト32-3に誤りがありました。
Y(int a, int b) {
super(a);
System.out.println("Y(int a,int b)
起動");
y = b;
}

コンストラクタY(int a, int b)に「System.out.println("Y(int a,int b)  起動");」という行が抜けていました。 コンストラクタが起動される順番に誤りはありませんが、表示結果として、p171に掲載されている結果にはなりません

p76から始まる第15講のサブタイトルは、
×
電子計算機
○電子計算機だから計算は得意?
です。

読者の「ゆーきち」様からのご指摘です。ありがとうございます。
p122のリスト23-1はリスト23-2と重複しております。
正しいリスト23-1は、
01: class Sample2301 {
02: public static void main(String[] arg) {
03: int array[] = {20,100,-40,500,70};
04: for(int i = 0; i < array.length; i++) {
05: System.out.println("
添字は"+ i + ":"
06: + "
値は" + array[i]);
07: }
08: }
09: }

です。