┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  執筆&編集 斎藤末広 suehiro@he.mirai.ne.jp  ┃ ┃'&┃&''*┃*''%┃%'  発行    江口昌宏 jmaga@yscon.co.jp    ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 広告募集:http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第16号 2002/05/xx  アプレット研究,好きな名称はどこまで可能か ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  プログラムを作成する上での注意事項:  Windows98SE とIE 5.5 を前提としています。  拡張子を表示するに設定してください。  SDK(JDK)は,1.3.1 を利用してます。 (注)環境によって出力などが異なることがあります。 ------------------------------------------------------------------------ ▼ しらみつぶし研究  前回のサンプル xHellpApplet.java の名称と思えるところに,ことごとく,x をつけて,エラーメッセージを出して勉強しましょう。  エラーメッセージを説明しながら,なぜ,そのエラーが出たのか分析していき ます。 ------------------------------------------------------------------------ ▼ 課題のサンプル  Jマガ第15号のサンプルは次のようでした。 例 j15-02 xHelloApplet.java import java.applet.Applet; import java.awt.Graphics; public class xHelloApplet extends Applet { public void paint(Graphics xg){ xg.drawString("Hello, World",100, 120); } }  では,上のプログラム内のなんらかの名前と思えるところはことごとく x をつ けましょう。 ximport xjava.xapplet.xApplet; ximport xjava.xawt.xGraphics; xpublic xclass xxHelloApplet xextends xApplet { xpublic xvoid xpaint(xGraphics xxg){ xxg.xdrawString("Hello, World",100, 120); } }  名前に x を付けてコンパイルすることで,変更していけないところが,エラー としてあぶり出されます。そのときのエラーメッセージから,名前が決定される からくりが分かります。では,早速,javac xHelloApplet.java とコンパイルを してみましょう。  なお,jstart.bat で,コマンドプロンプト画面を出しているときは,一度入力 したものは,↑キーで,再入力を省略できます。このような機能をヒストリー機 能といいます。積極的に利用してください。 ------------------------------------------------------------------------ ▼ 最初のエラーが重要  コンパイルのエラーメッセージは、SDK(JDK) のバージョンによって、微妙に 違っています。1.3.1 では、 次のようなエラーが表示されます。 ┏------------------------------------------------------------┓ C:\jwork>javac xHelloApplet.java xHelloApplet.java:1: 'class' または 'interface' がありません。 ximport xjava.xapplet.xApplet; ^ xHelloApplet.java:2: 'class' または 'interface' がありません。 ximport xjava.xawt.xGraphics; ^ xHelloApplet.java:4: 'class' または 'interface' がありません。 xpublic xclass xxHelloApplet xextends xApplet { ^ エラー 3 個 C:\jwork> ┗------------------------------------------------------------┛  エラーメッセージで、重要なものは、最初のエラーです。最初のエラーが,そ のコンパイルの最後まで影響しますので,2 つ目以降のエラーは,メッセージも, エラー数もほとんど意味がない場合が多いです。  では最初のエラーを見ていきましょう。 ------------------------------------------------------------------------ ▼ 'class'または 'interface'  最初に出たエラーメッセージは,次の通りです。 ┏------------------------------------------------------------┓ C:\jwork>javac xHelloApplet.java xHelloApplet.java:1: 'class' または 'interface' がありません。 ximport xjava.xapplet.xApplet; ^ ┗------------------------------------------------------------┛  (^)の記号は,カレットと呼びます。文章の校正で使用します。ハットとか,と んがりと言う人もいます。本来の校正記号は,「ここに挿入する」を示します。 Java コンパイラのメッセージでは,エラーが発見された場所を示します。  エラーメッセージは,「'class' または 'interface' がありません。」でし た。このメッセージは,ここに class か interface という単語がほしいと言っ ています。こういう特定の決まった単語を予約語(またはキーワード)といいま す。  Java のプログラムは,class という単位で管理されています。ソースプログラ ムをコンパイルすると class になります。プログラムに xxx と名前を付ける時 は,class xxx と書きます。そのキーワードの class が無いというのが,このエ ラーメッセージの意味です。class のかわりに,interface のときもあることが, このメッセージから分かります。interface は,また,いずれかの号で扱います。 ここに必要とされた class ですが,本来の class は,4 行目の xclass のとこ ろでした。では,エラーが発生した場所の ximport の x を取り除いた次のソー スプログラムをコンパイルをしてみましょう。 import xjava.xapplet.xApplet; ximport xjava.xawt.xGraphics; xpublic xclass xxHelloApplet xextends xApplet { xpublic xvoid xpaint(xGraphics xxg){ xxg.xdrawString("Hello, World",100, 120); } }  エラーメッセージは,次のようになります。 ┏------------------------------------------------------------┓ xHelloApplet.java:2: 'class' または 'interface' がありません。 ximport xjava.xawt.xGraphics; ^ ┗------------------------------------------------------------┛  2 行目の ximport のところでひっかかりました。こちらの x も取り除いて, 次のソースプログラムをコンパイルをしましょう。 import xjava.xapplet.xApplet; import xjava.xawt.xGraphics; xpublic xclass xxHelloApplet xextends xApplet { xpublic xvoid xpaint(xGraphics xxg){ xxg.xdrawString("Hello, World",100, 120); } }  エラーメッセージは,次のようになります。 ┏------------------------------------------------------------┓ xHelloApplet.java:4: 'class' または 'interface' がありません。 xpublic xclass xxHelloApplet xextends xApplet { ^ ┗------------------------------------------------------------┛  4行目の xpublic のところでひっかりました。メッセージの内容は同じです。 この x を取り除いて,次のソースプログラムをコンパイルしてみましょう。 import xjava.xapplet.xApplet; import xjava.xawt.xGraphics; public xclass xxHelloApplet xextends xApplet { xpublic xvoid xpaint(xGraphics xxg){ xxg.xdrawString("Hello, World",100, 120); } }  エラーメッセージは,次のようになります。 ┏------------------------------------------------------------┓ xHelloApplet.java:4: 'class' または 'interface' がありません。 public xclass xxHelloApplet xextends xApplet { ^ ┗------------------------------------------------------------┛  xclass のところで,ひっかりました。メッセージの内容は同じで,class が ほしいといっています。では,xclass の x を取り除いて いよいよ,class を 認識させましょう。  次のソースプログラムをコンパイルします。 import xjava.xapplet.xApplet; import xjava.xawt.xGraphics; public class xxHelloApplet xextends xApplet { xpublic xvoid xpaint(xGraphics xxg){ xxg.xdrawString("Hello, World",100, 120); } } ------------------------------------------------------------------------ ▼ class を認識して次の段階へ  エラーメッセージをみましょう。 ┏------------------------------------------------------------┓ xHelloApplet.java:4: '{' がありません。 public class xxHelloApplet xextends xApplet { ^ ┗------------------------------------------------------------┛  どうやら,class を認識して満足したようです。別のエラーが発見されました。  Java のプログラムは,class(もしくは,interface)で本体が始まります。こ の class の前の,import や,public は,前書きのようなものでした。今コン ルイルしたソースプログラムを再度みてみましょう。 import xjava.xapplet.xApplet; import xjava.xawt.xGraphics; public class xxHelloApplet xextends xApplet { xpublic xvoid xpaint(xGraphics xxg){ xxg.xdrawString("Hello, World",100, 120); } }  class の行の上の二つの行は,ともに,import(輸入)です。このプログラムで は,xjava.xapplet.xApplet と xjava.xawt.xGraphics をまず,輸入してくると記 述しています。ここまでは,コンパイラもどうやら認識したようです。  エラーメッセージをまた見てみましょう。 ┏------------------------------------------------------------┓ xHelloApplet.java:4: '{' がありません。 public class xxHelloApplet xextends xApplet { ^ ┗------------------------------------------------------------┛  次は,{ がほしいと言っています。{ の前の,xentends xApplet の 両方の x を取り除いて,{ を認識させることにしましょう import xjava.xapplet.xApplet; import xjava.xawt.xGraphics; public class xxHelloApplet extends Applet { xpublic xvoid xpaint(xGraphics xxg){ xxg.xdrawString("Hello, World",100, 120); } }  今度は,エラーがたくさん表示されて,最初のエラーをみることができません。 ------------------------------------------------------------------------ ▼ エラーが多いときの対応は  画面の上に消えたエラーメッセージをみるために,コンパイルのやり方を変更 します。次のバッチファイルを利用してコンパイルします。  このJマガは,Win98 を想定して解説しています。Win2000 や XPでは,スク ロールで消えたメッセージがみえるので,以下の作業は必要ありません。 ファイル名 jce2txt.bat @echo off rem エラーメッセージをファイルに書き出して,コンパイルをする rem 1.2 rem javac -Xstdout %1 > err.txt rem 1.4 rem javac -Xstdout err.txt %1 rem 1.3 oldjavac -J-Djavac.pipe.output=true %1 > err.txt  このバッチファイルは,JDK のバージョンによって,修正する必要があります。 1.4 の場合は,rem を行の頭につけたり取ったりして,次のようにして下さい。 rem は,remark の省略で,コメントになります。rem のついている行は,実行し ません。1.2 の場合も同様に修正してください。 ファイル名 jce2txt.bat @echo off rem エラーメッセージをファイルに書き出して,コンパイルをする rem 1.2 rem javac -Xstdout %1 > err.txt rem 1.4 javac -Xstdout err.txt %1 rem 1.3 rem oldjavac -J-Djavac.pipe.output=true %1 > err.txt  コンパイルのやり方は, jce2txt xHelloApplet.java です。そうすると,エラーメッセージが,err.txt というファイルに書き出され ます。このバッチファイル(jce2txt.bat)を使用してコンパイル(JDK1.3)の場合, oldjavac というコンパイラーを使用することになり,厳密には,javac とは, 違ったエラーメッセージがでますが,大同小異ですので,無視をします。 では,コンパイルしましょう。 ------------------------------------------------------------------------ ▼ import するものは,何?  err.txt を開いてみて,最初のエラーメッセージをみてみましょう。 ┏------------------------------------------------------------┓ xHelloApplet.java:1: クラス xjava.xapplet.xApplet が import に 見つかりません。 import xjava.xapplet.xApplet; ^ ┗------------------------------------------------------------┛  エラーの位置が,プログラムの 1 行目に戻りました。import (輸入)しようと したが,その国(場所)がないと言っています。本来の国(場所)の場所は, java.applet でしたので,当たり前です。java.applet.Applet というのは,java フォルダには,appletフォルダがあり,そこにある Applet という意味です。x を付けて違った名前にしましたので,そんなフォルダやクラスは見つかりません。 「import に見つかりません」というのはおかしな日本語です。「import 元に見 つかりません」の方がいいでしょう。  import を正しくしましょう。コンパイルして下さい。 import java.applet.Applet; import java.awt.Graphics; public class xxHelloApplet extends Applet { xpublic xvoid xpaint(xGraphics xxg){ xxg.xdrawString("Hello, World",100, 120); } }  err.txt を閉じずに,jce2txt.bat でコンパイルした人はいませんか?  err.txt を閉じずに,jce2txt でコンパイルすると,エラーメッセージが書き 出せないというトラブルが発生します。err,txt を閉じて jce2txt xHeloApplet.java とやってください。 ------------------------------------------------------------------------ ▼ ファイル名と class 名(プログラム名)は一致  また,err.txt を開いて,最初のエラーメッセージを見てください。 ┏------------------------------------------------------------┓ xHelloApplet.java:5: ';' がありません。 xpublic xvoid xpaint(xGraphics xxg){ ^ ┗------------------------------------------------------------┛  ; は,本来,命令文の終わりに入れます。xpublic xvoid で,なにかの一つの かたまり(文)と認識したようです。ともに x を取り除きましょう。 import java.applet.Applet; import java.awt.Graphics; public class xxHelloApplet extends Applet { public void xpaint(xGraphics xxg){ xxg.xdrawString("Hello, World",100, 120); } }  では,err.txt を閉じて下さい。エラーも減ってきたので,もとの,javac で コンパイルをしてみましょう。  エラーメッセージをみます。 ┏------------------------------------------------------------┓ xHelloApplet.java:4: クラス xxHelloApplet は public であり、ファ イル xxHelloApplet.java で宣言しなければなりません。 public class xxHelloApplet extends Applet { ^ ┗------------------------------------------------------------┛  プログラムのファイル名は,xHelloApplet.java なのに,4行で,xxHelloApplet と定義しているための不一致が発生しているというメッセージです。そうでした, ソースファイル名と ソースプログラム内の public class 名は一致させておく 必要がありました。(Jマガ第2号を参照)  class の名前を xxHelloApplet から xHelloApplet に変更して次のようにしま す。 import java.applet.Applet; import java.awt.Graphics; public class xHelloApplet extends Applet { public void xpaint(xGraphics xxg){ xxg.xdrawString("Hello, World",100, 120); } } ------------------------------------------------------------------------ ▼ シンボルは,名称のこと コンパイルをしましょう。そうすると次のエラーメッセージが出ます。 ┏------------------------------------------------------------┓ xHelloApplet.java:5: シンボルを解釈処理できません。 シンボル: クラス xGraphics 位置 : xHelloApplet の クラス public void xpaint(xGraphics xxg){ ^ ┗------------------------------------------------------------┛  シンボルというのは,名前のことです。プログラムの世界で,名前は,このシ ンボルの他に,ID,name などの英語が使用されます。このエラーは,xGraphics という名前は分からないと言っています。本来は,import してきたのは,Graphics ですので,当たり前です。x をとりましょう。 import java.applet.Applet; import java.awt.Graphics; public class xHelloApplet extends Applet { public void xpaint(Graphics xxg){ xxg.xdrawString("Hello, World",100, 120); } } コンパイルをして,エラーメッセージをみます。 ┏------------------------------------------------------------┓ xHelloApplet.java:6: シンボルを解釈処理できません。 シンボル: メソッド xdrawString (java.lang.String,int,int) 位置 : java.awt.Graphics の クラス xxg.xdrawString("Hello, World",100, 120); ^ ┗------------------------------------------------------------┛ これも,名前が分からないと言っています。おもしろいことに,( ) の中は, java.lang.String,int,int すなわち,文字列,整数,整数と正しく認識している ようです。では,xdrawString の x を取り除きます。drawString は,Graphics が持っているメソッドです。ですから,別の名前をここで利用するという訳には いきませんでした。  次のように直します。 import java.applet.Applet; import java.awt.Graphics; public class xHelloApplet extends Applet { public void xpaint(Graphics xxg){ xxg.drawString("Hello, World",100, 120); } } コンパイルをしましょう。 ------------------------------------------------------------------------ ▼ エラーメッセージを無くしても  エラーメッセージが無くなりました。いよいよ,実行できます。 appletviewer Hello.htm で実行しましょう。Hello.htm は,次のようでした,確認しておきますね。 例 j15-01 Hello.htm

 appletviewer で Hello.htm を表示しても,"Hello, World" と表示されませ ん。どうしてでしょうか。文法上は正しいのに表示してくれません。  元のプログラムと今のプログラムを比較しましょう。 例 j15-02 xHelloApplet.java import java.applet.Applet; import java.awt.Graphics; public class xHelloApplet extends Applet { public void paint(Graphics xg){ xg.drawString("Hello, World",100, 120); } } 今のプログラム import java.applet.Applet; import java.awt.Graphics; public class xHelloApplet extends Applet { public void xpaint(Graphics xxg){ xxg.drawString("Hello, World",100, 120); } }  違っているところは, public void xpaint(Graphics xxg){ xxg.drawString("Hello, World",100, 120); } のところで,  paint が xpaint  xg が xxg です。では,xpaint を paint にしてコンパイルしてみましょう。 import java.applet.Applet; import java.awt.Graphics; public class xHelloApplet extends Applet { public void paint(Graphics xxg){ xxg.drawString("Hello, World",100, 120); } }  エラーがでません。appletviewer Hello.htm と実行もしてください。  "Hello, World" と無事に表示をすることができました。xpaint ではだめで, paint なら表示できました。  前回のJマガ第15号で触れたように,Appletクラス を継承(拡張)して,ア プレットのプログラムを作成した場合の,動作は,次のようでした。 Applet クラスの中身  main(もしくはそれに代わるもの)   (2)表示する必要があれば,paint を実行しなさい。   (4)paint は,特に定義がないときは,白紙を表示 xHelloAppletクラスの中身  (1)基本的に親の動作を実行する。親のmainメソッド(それに代わるもの)を実    行する  (3)ただし,paint は,xxxx  ここで,表示するタイミングで,実行されるのは,xpaint ではなくて,paint です。xpaint だと,(3) の動作がなく,(4) の「白紙を表示」となってしまいまし た。表示するためには,paint にする必要があるということです。 補足:  paint の「白紙を表示」は,見た目がそうなるだけで, タグで確保さ れた場所に対してなにかを表示したかどうか,また,なにもせずに沈黙している かどうかは分かりません。 ------------------------------------------------------------------------ ▼ あなたが名付け親になれるのは  最初のプログラムとの違いは,Graphics xxg と,xxg.drawString の xg を xxg と名前を変更することができただけでした。 結局,私たちが名付け親になれる のは,この,xxg だけでした。  最初のプログラムをもう一度みましょう。 例 j15-02 xHelloApplet.java import java.applet.Applet; import java.awt.Graphics; public class xHelloApplet extends Applet { public void paint(Graphics xg){ xg.drawString("Hello, World",100, 120); } }  このプログラムで,x で始まっているものは,  プログラム名 xHelloApplet.java  class 名   xHelloApplet  変数名    xg  です。実は,この最初のサンプルは,すでに,私たちが名付け親になれるものは x で始めているという規則で出来ていました。変数名は,このプログラムで定義 して,このプログラムだけで使用しているので,好きな名前が可能です。プログ ラム名と class 名は一致していれば,いいので,一致していたら,好きな名前で よかった訳です。 ------------------------------------------------------------------------ ▼ 変更できる名前は,x をつけて明確にする  プログラムを学習するときに,自分で名前を変更できるところはどこか,認識 することで,プログラムを理解しやすくなります。Jマガでは,サンプルプログ ラムで,x で始まる名前のところは,自分で変更できるところです。みなさんも 学習するときは,そうするといいですよ。 -------------------------------------------------------------- ▼ 次号の予定  アプレット研究 画像の出し方  感想は,斎藤まで,suehiro@he.mirai.ne.jp  広告等のお問い合わせ:jmaga@yscon.co.jp ------------------------------------------------------------------------ ▼ 誤字・脱字等の修正,プログラムの修正など,以下の場所で確認できます。 過去の修正版等  http://www.mirai.ne.jp/~suehiro/java/jmaga/ 登録・削除および広告の案内  http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ フが所有しますが,商用を含めて,再利用,改変,発表を制限しません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。 広告募集 http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ------------------------------------------------------------------------ ▼アンケート(以下を返信してください)  この号のJマガは役立ったあるいは勉強になりましたか? 該当するものだけ残してください。 5: 大いに,YES 4: YES 3: 普通 2: NO 1: 大いに,NO その他