Javaを書いていると、必ずといっていいほどコンパイルエラーに遭遇します。特に初心者のころは、赤いエラーメッセージが大量に表示されるたびに「もう無理かも…」と絶望した人も多いでしょう。
私も最初のころは、エラーメッセージを見ても「英語がずらずら並んでいるだけ」としか思えず、何度もコードを消しては書き直すという非効率な作業を繰り返していました。
でも実は、コンパイルエラーのパターンは限られています。よくある原因をいくつか知っておくだけで、エラーに出会っても慌てず対処できるようになります。
この記事では、Javaのコンパイルエラーが出る原因と、それぞれの解決方法を一覧で紹介します。「エラーが出るたびに検索している」「同じエラーに何度もつまずく」という人に向けて、体系的にまとめています。
読み終えるころには、コンパイルエラーを「怖いもの」から「解読できるメッセージ」として扱えるようになるはずです。
Javaコンパイルエラーとは?実行時エラーとの違いを理解しよう

Javaのエラーには大きく2種類あります。コンパイルエラーと実行時エラーです。この2つを混同していると、エラーへの対処が的外れになりがちです。まずここを整理しておきましょう。
コンパイルエラーは、書いたコードをコンパイル(ソースコードをコンピュータが実行できる形式に変換する処理)するときに検出されるエラーです。要するに「プログラムを動かす前に発見できるミス」です。
IDEを使っているなら、コードを書いている段階で赤い波線が出て教えてくれます。コマンドラインでjavacを実行したときにエラーが出るケースも、これに該当します。
コンパイルエラーの最大の特徴は「実行前に見つかる」点です。言い方を変えれば、プログラムがそもそも動き出せない状態です。ある意味、早い段階でミスを教えてくれる親切なエラーともいえます。
コンパイルエラーが発生する仕組み
Javaはコンパイル言語なので、ソースコード(.javaファイル)を一度バイトコード(.classファイル)に変換してから実行します。この変換処理がコンパイルです。
コンパイル時、Javaコンパイラは構文の正しさ・型の整合性・クラスやメソッドの存在確認などを行います。これらのチェックで問題が見つかると、コンパイルが中断されてエラーメッセージが表示されます。
コンパイルエラーはコンパイラが「このコードは実行できませんよ」と教えてくれているメッセージです。怖がらずに、まずメッセージを読んでみることが大切です。
実行時エラーとの根本的な違い
実行時エラー(RuntimeException)は、コンパイルを通過して実際にプログラムを動かしたときに発生するエラーです。代表的なものにNullPointerExceptionやArrayIndexOutOfBoundsExceptionがあります。
コンパイルエラーとの最大の違いは「コードが動いてしまう」点です。文法的には正しいコードでも、実行中に予期しない状況(nullのオブジェクトへのアクセスなど)が起きると実行時エラーになります。
| 比較項目 | コンパイルエラー | 実行時エラー |
|---|---|---|
| 発生タイミング | コンパイル時 | 実行時 |
| 主な原因 | 文法・型の誤り | ロジックの誤り |
| 見つけやすさ | IDEが即座に指摘 | 実際に動かして発見 |
| 対処難易度 | 比較的低い | 場合によっては難しい |
コンパイルエラーの方が発見は早いので、ある意味「親切なエラー」です。実行時エラーと区別してつきあえるようになると、Javaの理解がぐっと深まります。
よくあるJavaコンパイルエラー一覧と原因
ここからが本題です。Javaでよく遭遇するコンパイルエラーを4種類に絞って解説します。それぞれのエラーメッセージと、起きる原因・解決策をセットで覚えておくと、次からはすぐに直せるようになります。
文法エラー(セミコロン・括弧・スペルミス)
最も多いのが、単純な文法ミスです。
エラーメッセージ例:
error: ';' expected
error: reached end of file while parsing主な原因は以下の3つです。
- 文末のセミコロン(
;)が抜けている - 波括弧(
{})の対応がずれている - メソッド名・変数名のスペルミス
// NG例:セミコロンが抜けている
System.out.println("Hello World")
// OK例
System.out.println("Hello World");括弧のズレは、ネストが深くなるほど発見しにくくなります。IDEのブラケット強調表示機能を使うと一目でわかるので、積極的に活用しましょう。
エラーメッセージに^マークが付いていれば、そこが問題箇所のヒントになっています。焦らず、まず^の位置を確認するのが近道です。
cannot find symbol(シンボルが見つからない)
cannot find symbolは、Javaコンパイルエラーの中でも特によく見るメッセージです。
エラーメッセージ例:
error: cannot find symbol
symbol: variable userName
location: class Main原因として多いパターンはこちらです。
- 変数を宣言せずに使っている
- 変数名・メソッド名のスペルミス(
userNameとusernameは別物) - スコープ外で変数を参照している
- importが抜けている
// NG例:userNameを宣言していない
System.out.println(userName);
// OK例
String userName = "田中";
System.out.println(userName);大文字・小文字の違いに気づかないケースが多いです。Stringとstringは全く別ものとして扱われます。「宣言したはずなのにエラーが出る」という場合は、スコープ(変数が有効な範囲)の外から参照していないかも確認してみましょう。
incompatible types(型の不一致)
型が合っていないときに出るエラーです。
エラーメッセージ例:
error: incompatible types: String cannot be converted to intJavaは静的型付け言語なので、型の扱いが厳格です。int型の変数にString型の値を代入しようとすると、このエラーが出ます。
// NG例:intにStringを代入しようとしている
int age = "25";
// OK例
int age = 25;
// 文字列を数値に変換したい場合
int age = Integer.parseInt("25");型変換が必要な場面では、Integer.parseInt()・String.valueOf()などのメソッドを使います。「なんとなく代入できそう」という感覚でコードを書くと引っかかりやすい部分です。
ファイル名とクラス名の不一致
地味に多いのがこのパターンです。Javaでは「ファイル名」と「publicクラス名」を必ず一致させるルールがあります。
エラーメッセージ例:
error: class Main is public, should be declared in a file named Main.javaたとえばHelloWorld.javaというファイルにpublic class Mainと書くと、このエラーが出ます。
// NG例:ファイル名がHelloWorld.javaなのにクラス名がMain
public class Main {
// ...
}
// OK例:ファイル名もMain.javaにする
public class Main {
// ...
}ファイルを作成するときにクラス名と合わせて命名する習慣をつけると、このミスはほぼなくなります。IDEを使っていれば、ファイル作成時にクラス名も自動で設定されるので安心です。
Javaコンパイルエラーの解決手順【ステップ別】
エラーが出たとき、「どこを見ればいいかわからない」と感じる人が多いです。でも手順を知っていれば、系統立てて対処できます。
エラーメッセージは「呪文」ではなく「診断書」です。読み方を一度覚えれば、大半のエラーは自力で解決できるようになります。
エラーメッセージの正しい読み方
コンパイルエラーのメッセージには、必ず以下の情報が含まれています。
- ファイル名と行番号 - どこのコードが問題かを示す
- エラーの種類 -
cannot find symbolや';' expectedなど - 補足情報 - 問題の変数名や型名など
Main.java:10: error: ';' expected
System.out.println("Hello")
^この例では「Main.javaの10行目、セミコロンが必要」とそのまま書いてあります。
複数のエラーが出たときは、最初のエラーから順に直していくのがコツです。最初のエラーが原因で連鎖的に別のエラーが出ているケースが多いため、上から1つずつ対処するのが効率的です。全部を一気に直そうとすると、どこが本当の原因かわからなくなります。
IDEを使った効率的なデバッグ
IntelliJ IDEA や Eclipse などのIDEを使うと、コンパイルエラーの解決がかなり楽になります。
主なメリットは以下のとおりです。
- リアルタイム検知 - コードを書きながら赤い波線でエラーを表示
- クイックフィックス - Alt+Enterなどのショートカットで修正候補を提案
- 補完機能 - 変数名・メソッド名のスペルミスを防ぐ
私の場合、IntelliJ IDEAを使い始めてから「セミコロン忘れ」や「スペルミス」によるエラーがほぼゼロになりました。IDEは入力ミスを未然に防いでくれる強力なツールです。
まだテキストエディタでコードを書いているなら、IDEへの移行を強くすすめます。特にIntelliJ IDEAはJava開発との相性がよく、無料のCommunity版でも十分な機能が揃っています。
javacコマンドラインでの対処法
IDEを使わずコマンドラインで開発している場合は、javacコマンドでコンパイルします。
# コンパイル
javac Main.java
# 実行
java Mainエラーが出たときは、メッセージに書かれているファイル名・行番号・エラー内容を確認します。
Main.java:5: error: reached end of file while parsing
}
^
1 errorこの場合、5行目付近で波括弧が閉じられていないことがわかります。
コマンドラインでの開発は、環境変数(JAVA_HOME・PATH)の設定が正しくないとjavacコマンド自体が動かないこともあります。javac -versionで動作確認してから始めると安心です。設定ファイルの修正後は、ターミナルを再起動して反映させることも忘れずに。
コンパイルエラーを未然に防ぐ予防策
コンパイルエラーへの対処法を覚えることも大切ですが、そもそもエラーを出しにくいコーディングの習慣を持つ方が、長期的には効率が上がります。エラーを直す時間より、エラーを出さない仕組みを作る時間の方が価値があります。
コーディング中にミスを減らすテクニック
エラーを減らすためにすぐ実践できる習慣を紹介します。
1. IDEのコード補完を積極的に使う
変数名・メソッド名は手入力せず、補完機能(Ctrl+Space)で入力します。スペルミスによるcannot find symbolエラーが劇的に減ります。
2. 小さい単位でコンパイルする
機能を全部実装してからコンパイルするのではなく、数十行書いたらこまめにコンパイルします。エラーの発生箇所を特定しやすくなります。
3. 括弧は開いたらすぐ閉じる
{を書いたら即座に}も書く習慣をつけます。IDEは自動補完してくれますが、手動で書く場合は特に意識しましょう。
4. 命名規則を一貫させる
変数名・クラス名の命名規則(Javaならキャメルケース)を統一して使います。userNameとusernameの混在を防ぎ、cannot find symbolを出しにくくなります。
コードレビューとテストで品質を高める
個人開発では特に、自分のコードを客観視する機会が少なくなりがちです。コードレビューを取り入れると、自分では気づかないミスパターンを発見できます。チーム開発なら、PRを出す前にほかのメンバーにレビューを依頼しましょう。
個人開発の場合は、静的解析ツールを活用する方法があります。
| ツール名 | 用途 |
|---|---|
| Checkstyle | コーディング規約のチェック |
| SpotBugs | バグパターンの検出 |
| SonarQube | 総合的なコード品質管理 |
これらのツールをビルドプロセスに組み込んでおくと、人間が見落としがちなエラーをあらかじめ検出できます。最初は設定が少し面倒ですが、一度整えると長期的に効いてきます。
まとめ:コンパイルエラーは怖くない
Javaのコンパイルエラーについて、種類・原因・解決方法をまとめました。
| エラー | 主な原因 | 解決のポイント |
|---|---|---|
';' expected | セミコロン忘れ | 行末を確認 |
cannot find symbol | 宣言・スペルミス | 変数宣言とスコープを確認 |
incompatible types | 型の不一致 | 型変換メソッドを使う |
| クラス名不一致 | ファイル名とクラス名がズレている | 両方を統一する |
コンパイルエラーは「コンパイラからの親切なフィードバック」です。エラーメッセージを読む習慣と、IDEを活用する環境を整えれば、ほとんどのコンパイルエラーは数分以内に解決できます。
「エラーが出るのは当たり前」くらいの気持ちで向き合うと、だいぶ楽になります。最初は戸惑っても、パターンを知れば知るほど対処が速くなるので、焦らず一つひとつ潰していきましょう。