はじめに (対象読者・この記事でわかること)
この記事は、Java入門者や大学・専門学校の情報系クラスで「Leap Year(うるう年)」判定プログラムを書いた際に、コンパイルエラーに直面した方を対象としています。
本稿を読むことで、leap_year.java が抱える典型的なエラー(クラス名とファイル名の不一致、文法ミス、型の誤用)を特定し、正しいコードに修正できるようになります。また、エラーメッセージの読み方や、Java 開発環境での基本的なビルド手順も復習できます。この記事を書くきっかけは、学習用課題で同様のエラーを多数目にし、原因解明に時間がかかっていた経験から、同じ壁にぶつかる読者の手助けをしたいと考えたためです。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。
- Java の基本的な文法(変数宣言、条件分岐、メソッド定義)
- JDK(Java Development Kit)のインストールと javac、java コマンドの利用方法
- 開発環境(IDE かコマンドライン)でのファイル保存とビルド手順
Leap Year 判定プログラムの概要とよくあるコンパイルエラー
うるう年は「4で割り切れ、100で割り切れない年」または「400で割り切れる年」と定義されます。このロジックを Java で実装する際に、以下のようなコードが典型的です。
Javapublic class LeapYear { public static void main(String[] args) { int year = Integer.parseInt(args[0]); if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { System.out.println(year + " はうるう年です。"); } else { System.out.println(year + " はうるう年ではありません。"); } } }
しかし、学習者が書くコードはしばしば次のようなエラーを引き起こします。
-
クラス名とファイル名の不一致
-public class LeapYearと宣言したのに、ファイル名をleap_year.javaとしているとclass LeapYear is public, should be declared in a file named LeapYear.javaというエラーが出ます。 -
文法ミス(セミコロン忘れ・波括弧の不整合)
-if (year % 4 == 0)の後にSystem.out.println(...);を書く際、セミコロンを忘れると';' expectedエラーになる。 -
型の誤用
-int year = args[0];と直接代入しようとすると、incompatible types: String cannot be converted to intというエラーが出ます。
本節では、これらエラーの原因をひとつずつ検証し、正しいコードへと導く手順を具体的に示します。
Leap Year 判定プログラムの実装・コンパイル手順とエラー解決
ステップ1 ファイル名とクラス名を合わせる
まず、ファイル名 と public クラス名 を一致させます。今回の例では LeapYear.java とします。
Bash$ touch LeapYear.java # ファイル作成(IDE を使う場合は新規作成)
ファイルに以下のコードを書き込みます(あとで修正する可能性があるので、まずは最小構成で保存)。
Javapublic class LeapYear { public static void main(String[] args) { // 後で実装 } }
ステップ2 引数取得と型変換の正しい書き方
args[0] は文字列なので、整数へ変換する必要があります。Integer.parseInt を使うのが一般的です。
Javaint year = Integer.parseInt(args[0]);
注意点
- 配列のインデックスが存在しない場合は ArrayIndexOutOfBoundsException が実行時に発生します。最低でも 1 つの引数が必要です。
- 例外処理を入れると安全です。
Javaif (args.length == 0) { System.out.println("使用方法: java LeapYear <year>"); return; } int year; try { year = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.out.println("整数を入力してください。"); return; }
ステップ3 うるう年判定ロジックの実装
上記ロジックを if 文で記述しますが、波括弧の対応 と セミコロン に注意しましょう。
Javaif ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { System.out.println(year + " はうるう年です。"); } else { System.out.println(year + " はうるう年ではありません。"); }
ステップ4 コンパイルと実行
ターミナル(または IDE のビルド機能)で以下を実行します。
Bash$ javac LeapYear.java # エラーが無ければ次へ $ java LeapYear 2024 2024 はうるう年です。
ハマった点やエラー解決
| 発生したエラー | 原因 | 解決策 |
|---|---|---|
class LeapYear is public, should be declared in a file named LeapYear.java |
ファイル名とクラス名が不一致 | ファイル名を LeapYear.java に変更 |
';' expected |
if 文の中でステートメントの終端セミコロン忘れ |
条件式のブロック内にすべて ; を付与 |
incompatible types: String cannot be converted to int |
args[0] を直接 int に代入 |
Integer.parseInt(args[0]) で変換 |
ArrayIndexOutOfBoundsException |
引数が不足 | args.length をチェックし、エラーメッセージを出す |
解決策のまとめ
- ファイル名とクラス名は必ず一致させる。IDE が自動でリネームしてくれる場合もあるが、手動で確認する習慣をつける。
- 文法エラーはコンパイル時にすぐに表示されるので、エラーメッセージを読むことが最重要。
javacが指摘する行番号と内容をメモし、該当箇所を修正。 - 型変換は必ず
parseInt系のメソッドを使用し、例外処理で不正入力に備える。 - テストは必ず複数ケースで実行(例: 1900, 2000, 2020, 2021)し、ロジックが期待通りに動くことを確認する。
まとめ
本記事では、leap_year.java がコンパイルエラーになる典型的な原因(ファイル名とクラス名の不一致、文法ミス、型変換エラー)を整理し、正しいコード例とコンパイル手順を具体的に示しました。
- ファイル名とクラス名は一致させること
- エラーメッセージを読み解き、セミコロンや波括弧の有無を確認
- 文字列から整数への変換は
Integer.parseIntと例外処理で安全に
これらのポイントを押さえることで、Java の基礎的なコンパイルエラーを速やかに解決でき、うるう年判定プログラムを正しく動作させられるようになります。次回は「JUnit を使った自動テストの書き方」や「Gradle でのビルド自動化」について解説する予定です。
参考資料
- Oracle Java Documentation – javac
- Java SE API – Integer.parseInt
- 「Effective Java」第3版(Joshua Bloch)
- うるう年判定ロジック(Wikipedia)
