Java プログラムはどんな見た目か
前のページでは Java を動かしました。今度は、コードそのものが実際に何でできているのかを見ていきましょう。Java は厳密で明示的です。すべてのプログラムが従わなければならない決まった形があり、コンパイラは一行も実行される前にその形をチェックします。
これが、ありうる中で最小の完全な Java プログラムです。実行してみましょう:
一行を出力するにしてはずいぶん多くの言葉ですが、Python や JavaScript と違って、どれ一つ省略できません。どの部分も必須なので、それぞれが何をしているのかを理解する価値があります。外側から内側へと分解していきましょう。
すべてはクラスの中にある
Java には、ファイルの最上位レベルに漂う「ばらばらの」コードはありません。すべてのコードは、class キーワードと名前で宣言されるクラスの中に存在します:
public class Main {
// everything goes in here
}
開き { と、対応する閉じ } がクラスの本体を区切ります。Main という名前はあなたが選べますが、一つ重要なルールがあります:通常の .java ファイルでは、public クラスはファイル名と正確に一致しなければなりません。 public class Main は Main.java に属します。大文字・小文字を間違えると、コンパイラはビルドを拒否します。
クラスが本当は何なのかは、クラスの章で学びます。今のところは、public class Main { ... } をコードを包む必須のラッパーとして扱ってください。
main メソッドはスタートライン
Java プログラムを実行すると、ランタイムは実行を始めるために一つの特定のメソッドを探します:
public static void main(String[] args) {
// your code starts here
}
このシグネチャに交渉の余地はありません。各語にはそれぞれ役割があります:
public- ランタイムがクラスの外側からそれに到達できる。static- クラスのオブジェクトを先に作らずに実行される。void- 終わるときに何も返さない。main- ランタイムが探す正確な名前。String[] args- プログラムに渡されたコマンドライン引数の配列。
一語でも誤っていると——static の代わりに Static、String[] args の代わりに String args——コードはコンパイルできるかもしれませんが、起動時に Error: Main method not found in class Main で失敗します。このメッセージはほとんどの場合、この行のタイプミスを意味します。
文はセミコロンで終わる
文とは一つの完結した命令です。Java では、すべての文はセミコロン ; で終わります。コンパイラはセミコロンを使って、一つの命令がどこで終わり次が始まるかを判断します——改行はコンパイラにとって意味を持ちません。
改行は無視されるので、三つの文すべてを一行に置いても動きます——もっとも、そんなふうに Java を書く人はいませんが:
int score = 90; score = score + 5; System.out.println(score);
セミコロンを忘れると、コンパイラはプログラムが実行される前にあなたを止めます:
int score = 90
System.out.println(score);
error: ';' expected
int score = 90
^
セミコロンの抜けは、初心者として遭遇する最もよくあるコンパイルエラーです。コンパイラがある行を指したら、その上の行も確認してください——本当の抜けはそこにあることが多いのです。
ブロックと波かっこ
波かっこ { } は文をブロックにまとめます。クラスの本体はブロックであり、メソッドの本体はブロックであり、if やループの本体もブロックです。ブロックは別のブロックの中に入れ子にできます:
文との違いに注目してください:ブロックを開く行はセミコロンではなく { で終わり、メソッド・クラス・if・ループの閉じ } の後にはセミコロンを付けません。これを取り違えるのは初期の典型的なミスです:
public static void main(String[] args) {
System.out.println("hi");
}; // <- this semicolon is unnecessary (and after a class/method, wrong)
例のインデントは純粋に人間のためのものです。Java はそれを無視しますが、一貫したインデントこそ、あなたや他の全員がどの { がどの } に対応するかを把握する手段です。エディタに自動インデントを任せれば、かっこは自然にそろいます。
Java は大文字・小文字を区別する
Java は大文字と小文字をまったく別物として扱います。score、Score、SCORE は三つの別々の名前です。同じことがキーワードや組み込みの名前にも当てはまります:
system.out.println(小文字の s)と書いたり、String Name と書いてから name を使おうとしたりすると、コンパイラはそれを拒否します。初心者がよく大文字・小文字を間違える名前をいくつか挙げます:
System- 大文字のS。system.out.println(...)はコンパイルできません。String- 大文字のS。小文字のプリミティブ型と違い、これはクラスです。void、int、public、static- すべて小文字。これらはキーワードです。
ほとんどの「cannot find symbol」エラーは、大文字・小文字のうっかりミスにたどり着きます。エラーは見つけられなかったシンボルまで教えてくれます——その大文字・小文字を、あなたが入力したものと照らし合わせてください。
部品を組み合わせる
これは、このページのすべて——クラス、main メソッド、いくつかの文、入れ子のブロック、一貫した大文字・小文字——を使った、少し大きめのプログラムです:
上から下へ読んでみましょう:クラスがすべてを包み、main が実行の始まる場所で、各命令は ; で終わり、if の本体は独自のブロックにまとめられ、すべての組み込みの名前が正しい大文字・小文字で書かれています。これが、あなたが書くことになるほぼすべての Java プログラムの骨格です。
次:コメント
これで Java ファイルの構造を読めるようになりました。次に加えるべきは、人間のためのメモ——コンパイラが完全に無視するテキストです。次のページではコメントを扱います:一行形式の //、ブロック形式の /* */、そしてコメントが本当にコードの中で居場所を得るのはいつか。
よくある質問
Java プログラムの基本的な構文とは?
すべての Java プログラムはクラスの中に存在し、実行は厳密なシグネチャ public static void main(String[] args) を持つメソッドから始まります。文はセミコロンで終わり、コードのブロックは波かっこ { } でまとめられます。最小限のプログラムは public class Main { public static void main(String[] args) { System.out.println("Hi"); } } です。
なぜ Java には public static void main(String[] args) が必要なのですか?
それは Java ランタイムが探す、まさにそのエントリーポイントだからです。public はランタイムが外部から呼び出せるようにし、static はオブジェクトを先に作らずに実行されることを意味し、void は何も返さないことを意味し、String[] args はコマンドライン引数を受け取ります。どれか一語でも——大文字・小文字でさえ——変えると、プログラムはコンパイルはできても起動せず、Error: Main method not found が出ます。
Java のすべての文にセミコロンは必要ですか?
すべての文はセミコロンで終わります——変数宣言、代入、メソッド呼び出しなど。しかしブロックで終わる行(if、for、while、クラスやメソッドのヘッダー)は代わりに { で終わり、それらのブロックの閉じ } の後にはセミコロンを付けません。セミコロンの付け忘れは、Java の初心者が最もよく出すコンパイルエラーです。