[???] / [Java FAQ] / [S002]
S002: 最初の一歩 - Hello World
注意:この章は S002-Q01 から S002-Q07 まで通しで読む事で正しい理解が得られるよ
うに書いております。是非 S002-Q01 から S002-Q07 まで通しでご覧ください。



[S002-Q01]
Back
Hello World って何ですか? [S002-A01] Hello World と表示するだけの簡単なプログラムです。 以下に例を示します。 [アプリケーションの例] public class HelloWorld { public static void main( String[] args ) { System.out.println( "Hello World" ); } } [アプレットの例] import java.applet.Applet; public class HelloWorldApplet extends Applet { public void paint( Graphics g ) { g.drawString( "Hello World", 0, 0 ); } } [アプレットを表示させるHTMLの例] <HTML> <BODY> <APPLET CODE="HelloWorldApplet.class" WIDTH=160 HEIGHT=120 > </APPLET> </BODY> </HTML> コンパイルするには 上記の例をエディタ等を使用して ファイルとして保存し 保存したディレクトリに移動して javac 保存したファイル名とします。 例えば アプリケーションの例を HelloWorld.java というファイル名で保存し た場合は以下のようになります。 javac HelloWorld.java コンパイルが成功すれば HelloWorld.class というファイルが生成されます。 また 実行するためには java 生成されたクラス名とします。 この例の場合では以下のようになります。 java HelloWorld また アプレットの例を実行するには アプレットの例を表示させる HTML の 例をエディタ等を使用してファイルとして保存し、それを InternetExplorer や Netscape や appletviewer で実行します。アプレットの例を表示させる HTML の例を HelloWorldApplet.html というファイル名で保存し appletviewer を使用して表示させる場合は 以下のようにします。 appletviewer HelloWorldApplet.html appletviewer はアプレットのデバッグをするときに便利ですので使用方法を 覚えておく事をお勧めします。
[S002-Q02]
Back
コンパイルしようとすると エラー: HelloWorld.java を読み込めません。 error: Can't read; HelloWorld.java などと表示されてコンパイルされません。 [S002-A02] いくつかの原因が考えられます。 以下に代表的なものを挙げます。 ・ファイル名をタイプミスしていた。 ・ディレクトリを間違えた。 ファイルを保存したディレクトリではないディレクトリでコンパイルしよう とした。 ・ファイル名の大文字、小文字を間違えてタイプした。 例えば HeloWorld.java というファイル名で保存したのに javac helloworld.java とタイプしていた。 Windwos は大文字小文字を区別しないため(*注1) HelloWorld.java と helloworld.java を 同一ファイルとみなしますが Java はファイル名の 大文字小文字を区別するため同一とは認めません。 ・Windows 標準添付の「メモ帳」すなわち Notepad.exe を使用していて HelloWorld.java で保存したつもりが HelloWorld.java.txt になってい た。 対処法を以下に挙げます。 ・メモ帳で保存するときに 「"HelloWorld.java"」 のように ダブルクォーテーションで囲んだファイル名で保存する。 ・とりあえず HelloWorld.java.txt で保存し、エクスプローラ等で 改名する。 Windows 95, Windows 98 は標準で登録されているファイルの拡張子は表示 しないようになっています。例えば エクスプローラ等では HelloWorld.java と表示されていても 実際は HelloWorld.java.txt という 名前で保存されている可能性があります。 この場合 エクスプローラの [ツール] -> [フォルダオプション] -> [表示] -> [登録されているファイルの拡張子は表示しない] の欄のチェックを外す事で全てのファイルの拡張子を表示する事が出来る ようになります。 (注釈) 1: MS-DOS が大文字のファイル名しか許さなかった名残です。
[S002-Q03]
Back
コンパイルすると printIn( java.lang.String ) が解釈できないとエラーが 出ます。 [例] HelloWorld.java:3: シンボルを解釈処理できません。 シンボル: メソッド printIn (java.lang.String) 位置 : java.io.PrintStream の クラス System.out.printIn( "Hello World" ); ^ エラー 1 個 [S002-A03] printIn() 「大文字のアイ」ではなくて println() 「小文字のエル」です。 line が ln と省略されているというわけです。 具体的には このようになります。 public class HelloWorld { public static void main( String[] args ) { System.out.println( "Hello World" ); } } このような 単なる読み間違い、書き間違いの類は非常に多いです。エラーが 出たら 人に質問する前に タイプミスしていないか もう一度チェックしてみ てください。 (参照) java.lang.System#out http://java.sun.com/products/jdk/1.2/ja/docs/ja/api/java/lang/System.html#out java.io.PrintStrem#println( java.lang.String ) http://java.sun.com/products/jdk/1.2/ja/docs/ja/api/java/io/PrintStream.html#println(java.lang.String)
[S002-Q04]
Back
コンパイルしようとすると test.java:1: クラス HelloWorld は public であり、ファイル HelloWorld.java で宣言しなければなりません。 public class HelloWorld { とエラーが出てコンパイルされません。 [S002-A04] エラーメッセージのとうり、public 宣言したクラス名とファイル名は一致し ていなければなりません。 対処法としては ・クラス名とファイル名を一致させる。 ・クラスから public 宣言をはずす。 があります。 クラスから public 宣言をはずした時は注意が必要です。この例の場合では test.java をコンパイルしても test.class は生成されず HelloWorld.class が生成されます。
[S002-Q05]
Back
コンパイルしようとすると Graphics が解釈できないとエラーが出ます。 [例] HelloWorldApplet.java:3: シンボルを解釈処理できません。 シンボル: クラス Graphics 位置 : HelloWorldApplet の クラス public void paint( Graphics g ) { ^ エラー 1 個 [S002-A05] java.awt.Graphics を import し忘れているためです。 使用するクラスは import しなくてはなりません。 具体的には以下のようになります。 import java.applet.Applet; import java.awt.Graphics; public class HelloWorldApplet extends Applet { public void paint( Graphics g ) { g.drawString( "Hello World", 0, 0 ); } } また 「*」を使用して指定した package の全てのクラスを import すること もできます。具体的には以下のようになります。 import java.applet.Applet; import java.awt.*; public class HelloWorldApplet extends Applet { public void paint( Graphics g ) { g.drawString( "Hello World", 0, 0 ); } } また import せずに パッケージも含めたクラス名を使用する事も出来ます。 具体的には以下のようになります。 import java.applet.Applet; public class HelloWorldApplet extends Applet { public void paint( java.awt.Graphics g ) { g.drawString( "Hello World", 0, 0 ); } } このようなクラスの import し忘れも非常に多いミスの一つです。 また、import はしたがクラス名をタイプミスしている等のミスもあります。 コンパイルエラーが起こった場合はもう一度良くチェックしてみてください。
[S002-Q06]
Back
例のアプレットを実行してみましたが 何も表示されません。 [S002-A06] java.awt.Graphics#drawString( java.lang.String, int, int ) の第2引数と 第3引数の指定が表示する文字列の左下の座標の指定になって いるためです。 対処するには以下のようにします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Font; public class HelloWorldApplet extends Applet { public void paint( Graphics g ) { Font font = g.getFont(); g.drawString( "Hello World", 0, font.getSize() ); } } また、以下のように適当にあたりをつけていく方法もあります。 import java.applet.Applet; import java.awt.Graphics; public class HelloWorldApplet extends Applet { public void paint( Graphics g ) { //これでダメなら 20にしてみる g.drawString( "Hello World", 0, 10 ); } } またメソッドの呼び出し方法等は http://java.sun.com/products/jdk/1.2/ja/docs/ja/api/index.html から得ることが出来ます。また http://java.sun.com/products/jdk/1.2/ja/download-ja-docs.html から 上のドキュメントをオフラインで読めるパッケージがダウンロード できますので 是非ダウンロードしておく事をお勧めします。 (参照) java.awt.Graphics#drawString( java.lang.String, int, int ) http://java.sun.com/products/jdk/1.2/ja/docs/ja/api/java/awt/Graphics.html#drawString(java.lang.String, int, int)
[S002-Q07]
Back
このプログラムで書かれている内容の意味を教えてください。 [S002-A07] 以下に示します。 [アプリケーションの例の解説] 1行目 public class HelloWorld { 2行目 public static void main( String[] args ) { 3行目 System.out.println( "Hello World" ); 4行目 } 5行目 } まず1行目 public class HelloWorld { ^ のカッコでブロックが開始している事を示しています。対応するのは5行目 の閉じカッコで、そのブロックは HelloWorld という名前の public なクラ スについて書かれているということが示されています。 2行目は public static void main( String[] args ) { ^ このカッコも ブロックが開始している事を示しています。 対応するのは 4行目の閉じカッコで、その中のブロックは main という名前の public で static な メソッドがあり、 そのメソッドは 引数が java.lang.String 型の配列 で存在し、 引数の名前を args (ARGument String)と命名していて 戻り値が void すなわち戻り値が無いという事を示しています。 重要なのは main という名前のメソッドである、という部分で java HelloWorld としたときに Java は HelloWorld というクラスの main という名前の メソッドを探して実行させます。この名前のメソッドが無いと Java は エラーを出して実行を中止してしまいますので注意してください。 何故 main という名前なのかについては 良くわかりませんが、 例えば C言語や C++ でも main という名前の関数が無いと駄目なので その名残なのかもしれません。 3行目だけが 実際に実行される箇所で、このプログラムの要です。 System.out.println( "Hello World" ); java.lang.System の out と命名された java.io.PrintStream の フィールドに対して HelloWorld という文字列 を引数として println() と いう名前のメソッドを呼び出す。 というのが この行の概要です。 ["]でくくられた部分は文字列である事を示していて、 [(]で始まり [)]で終わっている箇所はメソッドの引数の場所である事を示 しています。[(]で始まり[)]で終わる表記法は算数と同じように計算順序を 決めるときにも使用します。 最後の[;]は これで一つの文が終わったことを示しています。 これがないと計算式を1行に二つ並べたときなどに 計算式の区切りが解らな くなります。 まず java.lang.System というクラスを使用していますが java.lang パッケージに含まれるクラスは import せずに使えます。 System のメンバ out フィールドは何もしなければ 標準出力(*注1)に結び 付けられています。標準出力にたいして println (PRINT LiNe) すなわち 1行書く、という命令を実行するわけです。このとき書く内容は引数で指定 した Hello World になります。 4行目は 2行目で書いたメソッドの終わりを示す 閉じカッコです。 5行目は 1行目で書いたクラスの終わりを示す 閉じカッコです。 [アプレットの例の解説] 1行目 import java.applet.Applet; 2行目 import java.awt.Graphics; 3行目 import java.awt.Font; 4行目 public class HelloWorldApplet extends Applet { 5行目 public void paint( Graphics g ) { 6行目 Font font = g.getFont(); 7行目 g.drawString( "Hello World", 0, font.getSize() ); 8行目 } 9行目 } 1行目 から 3行目までは使用するクラスを import しています。 1行目は java.applet パッケージの Applet クラスを 2行目は java.awt パッケージの Graphics クラスを 3行目は java.awt パッケージの Font クラスを それぞれ import します。 これらの行以降で出てくる Applet、Graphics、Font はそれぞれ java.applet.Applet、java.awt.Graphics、java.awt.Font であることを示 しています。 4行目はクラスの宣言です。 アプリケーションの例と違うのはクラスの名前が HelloWorld から HelloWorldApplet に変わった事と、Applet を extend (継承)している事で す。アプレットの中核となるクラスは必ず java.applet.Applet を 継承し なければなりません。 5行目はメソッドの宣言です。 これから始まるブロックが public な paint という名前のメソッドである 事を示しています。 そのメソッドの引数は java.awt.Graphics で g という名前であり、 そのメソッドの戻り値は void すなわち 戻り値が無いという事を示してい ます。 6行目は実際に実行される部分で、代入文です。 font という名前の java.awt.Font のインスタンスを宣言し、 それに g.getFont() の戻り値である java.awt.Font を代入し(結び付け)て います。 7行目が実際に実行される部分の中核です。 paint メソッドの引数 g(Graphics) はディスプレイに表示される java.awt.Graphics を保持しています。 その g に対して drawString メソ ッドを呼び出していますので、これは ディスプレイに対して drawString (文字列を(絵として描いて)表示) するという意味になります。 表示する文字列は 第一引数で指定された HelloWorld です。 表示位置はアプレットの画面の左上を原点(0,0)として font.getSize() は 文字の高さを表しますから文字列の左下が (0,文字の高さ) すなわち画面左 上にぴったりと表示する事になります。 8行目は paint メソッドの終了の閉じカッコです。 9行目は HelloWorldApplet クラスの終了の閉じカッコです。 ちなみにアプレットには main メソッドを書く必要はありません。 [アプレットを表示させる HTML の例の解説] 1行目 <HTML> 2行目 <BODY> 3行目 <APPLET CODE="HelloWorldApplet.class" WIDTH=160 HEIGHT=120 > 4行目 </APPLET> 5行目 </BODY> 6行目 </HTML> 1行目は HTML タグの開始です。 ここから有効な HTML ドキュメントの記述が開始される事を示しています。 2行目は BODY タグの開始です。 ここから画面に表示すべき内容の記述が開始される事を示しています。 3行目は APPLET タグの開始です。 CODE="HelloWorldApplet.class" はアプレットの中核となる java.applet.Applet を継承したクラスを指定します。 WIDTH=160 HEIGHT=120 は幅 160 ドット高さ 120 ドットの領域をアプレッ トの為に割り当てる事を示しています。 4行目は APPLET タグの終了です。 5行目は BODY タグの終了です。 ここまでで画面に表示すべき内容の記述が終わった事を示しています。 6行目は HTMLタグの終了です。 ここまでで有効な HTML ドキュメントの記述が終わった事を示しています。 (注釈) 1:標準出力 (stdout(STanDard OUT)) とは OS の機能の一つで OS が標準で 備えている文字の出力先の事です。出力された文字は OS によって普通は ディスプレイに表示されるという形式でユーザに示されます。
[S002-Q08]
Back
Exception in thread "main"java.lang.NoClassDefFoundError:HelloWorld というエラーが出て動きません。 [S002-A08] 実行時エラーがでていることから、javaインタープリターは動いています。 HelloWorld という名前のクラスがみつからないというエラーです。 JDK1.2 以降の Java をお使いの場合、、 プロンプト> java -classpath . HelloWorld でどうでしょう? これでうまくいくならば CLASSPATH環境変数の 設定に . (ドット、ピリオド)がないのが原因です。 CLASSPATH環境変数は、間違い易いことが多い機能ですので完全に理解するまでは使わず、 -classpath 実行時オプションでクラスパス(java VM がクラスファイルを探すパス)を 教えてあげることをお勧めします。 doskey とうてば、Windows95/98 の MS-DOSプロンプトでのコマンド入力も苦にならないでしょう。

Back
contributor: Michel Ishizuka
コメントの送り先:Java FAQ BBS