はじめに (対象読者・この記事でわかること)

この記事は、Java入門者や大学・専門学校の情報系クラスで「Leap Year(うるう年)」判定プログラムを書いた際に、コンパイルエラーに直面した方を対象としています。
本稿を読むことで、leap_year.java が抱える典型的なエラー(クラス名とファイル名の不一致、文法ミス、型の誤用)を特定し、正しいコードに修正できるようになります。また、エラーメッセージの読み方や、Java 開発環境での基本的なビルド手順も復習できます。この記事を書くきっかけは、学習用課題で同様のエラーを多数目にし、原因解明に時間がかかっていた経験から、同じ壁にぶつかる読者の手助けをしたいと考えたためです。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。
- Java の基本的な文法(変数宣言、条件分岐、メソッド定義)
- JDK(Java Development Kit)のインストールと javacjava コマンドの利用方法
- 開発環境(IDE かコマンドライン)でのファイル保存とビルド手順

Leap Year 判定プログラムの概要とよくあるコンパイルエラー

うるう年は「4で割り切れ、100で割り切れない年」または「400で割り切れる年」と定義されます。このロジックを Java で実装する際に、以下のようなコードが典型的です。

Java
public 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 + " はうるう年ではありません。"); } } }

しかし、学習者が書くコードはしばしば次のようなエラーを引き起こします。

  1. クラス名とファイル名の不一致
    - public class LeapYear と宣言したのに、ファイル名を leap_year.java としていると class LeapYear is public, should be declared in a file named LeapYear.java というエラーが出ます。

  2. 文法ミス(セミコロン忘れ・波括弧の不整合)
    - if (year % 4 == 0) の後に System.out.println(...); を書く際、セミコロンを忘れると ';' expected エラーになる。

  3. 型の誤用
    - int year = args[0]; と直接代入しようとすると、incompatible types: String cannot be converted to int というエラーが出ます。

本節では、これらエラーの原因をひとつずつ検証し、正しいコードへと導く手順を具体的に示します。

Leap Year 判定プログラムの実装・コンパイル手順とエラー解決

ステップ1 ファイル名とクラス名を合わせる

まず、ファイル名public クラス名 を一致させます。今回の例では LeapYear.java とします。

Bash
$ touch LeapYear.java # ファイル作成(IDE を使う場合は新規作成)

ファイルに以下のコードを書き込みます(あとで修正する可能性があるので、まずは最小構成で保存)。

Java
public class LeapYear { public static void main(String[] args) { // 後で実装 } }

ステップ2 引数取得と型変換の正しい書き方

args[0] は文字列なので、整数へ変換する必要があります。Integer.parseInt を使うのが一般的です。

Java
int year = Integer.parseInt(args[0]);

注意点
- 配列のインデックスが存在しない場合は ArrayIndexOutOfBoundsException が実行時に発生します。最低でも 1 つの引数が必要です。
- 例外処理を入れると安全です。

Java
if (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 文で記述しますが、波括弧の対応セミコロン に注意しましょう。

Java
if ((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 でのビルド自動化」について解説する予定です。

参考資料