Javaを書いていて、コンパイルエラーが出るたびに手が止まっていませんか?英語のエラーメッセージを見て「何が原因かわからない」と困った経験は、Java初心者なら誰でもあるはずです。
実は、Javaのコンパイルエラーはパターンが決まっています。セミコロン忘れ・cannot find symbol・型の不一致・クラス名不一致の4つを押さえるだけで、エラーの大半は自力で解決できるようになります。
この記事では、よくあるコンパイルエラー4パターンの原因と解決コードを一覧で紹介し、実行時エラーとの違い・IDEを使った効率的なデバッグ方法・エラーを出さない予防策まで体系的に解説します。
Javaのコンパイルエラーとは?実行時エラーとの違い

Javaのエラーには大きく2種類あります。コンパイルエラーと実行時エラーです。この2つを混同していると、エラーへの対処が的外れになりがちです。まずここを整理しておきましょう。
コンパイルエラーは、書いたコードをコンパイル(ソースコードをコンピュータが実行できる形式に変換する処理)するときに検出されるエラーです。要するに「プログラムを動かす前に発見できるミス」です。
IDEを使っているなら、コードを書いている段階で赤い波線が出て教えてくれます。コマンドラインでjavacを実行したときにエラーが出るケースも、これに該当します。
コンパイルエラーの最大の特徴は「実行前に見つかる」点です。言い方を変えれば、プログラムがそもそも動き出せない状態です。早い段階でミスを教えてくれる親切なエラーです。
コンパイルエラーが発生する仕組み
Javaはコンパイル言語なので、ソースコード(.javaファイル)を一度バイトコード(.classファイル)に変換してから実行します。この変換処理がコンパイルです。
コンパイル時、Javaコンパイラは構文の正しさ・型の整合性・クラスやメソッドの存在確認などを行います。これらのチェックで問題が見つかると、コンパイルが中断されてエラーメッセージが表示されます。
コンパイルエラーはコンパイラが「このコードは実行できませんよ」と教えてくれているメッセージです。怖がらずに、まずメッセージを読んでみましょう。
実行時エラーとの根本的な違い
実行時エラー(RuntimeException)は、コンパイルを通過して実際にプログラムを動かしたときに発生するエラーです。代表的なものにNullPointerExceptionやArrayIndexOutOfBoundsExceptionがあります。
コンパイルエラーとの最大の違いは「コードが動いてしまう」点です。文法的には正しいコードでも、実行中に予期しない状況(nullのオブジェクトへのアクセスなど)が起きると実行時エラーになります。
| 比較項目 | コンパイルエラー | 実行時エラー |
|---|---|---|
| 発生タイミング | コンパイル時 | 実行時 |
| 主な原因 | 文法・型の誤り | ロジックの誤り |
| 見つけやすさ | IDEが即座に指摘 | 実際に動かして発見 |
| 対処難易度 | 比較的低い | 場合によっては難しい |
コンパイルエラーの方が発見は早く、「親切なエラー」といえます。実行時エラーと区別してつきあえるようになると、Javaの理解がぐっと深まります。
よくあるJavaコンパイルエラー一覧と原因
Javaでよく遭遇するコンパイルエラーを5種類に絞って解説します。それぞれのエラーメッセージと、起きる原因・解決策をセットで覚えておくと、次からはすぐに直せるようになります。
文法エラー(セミコロン・括弧・スペルミス)
最も多いのが、単純な文法ミスです。
エラーメッセージ例:
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は全く別ものとして扱われます。
「宣言したはずなのにエラーが出る」という場合は、スコープ(変数が有効な範囲)の外から参照していないかも確認してみましょう。
私自身、Java Silver取得時にスコープの理解不足でcannot find symbolを連発した経験があります。ifブロック内で宣言した変数をブロック外から参照しようとして、なぜエラーになるのかわからず何時間も悩みました。スコープは「変数の寿命」と考えると理解しやすくなります。
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を使っていれば、ファイル作成時にクラス名も自動で設定されるので安心です。
package does not exist(パッケージが見つからない)
外部ライブラリやほかのパッケージのクラスを使おうとしたときに出るエラーです。
エラーメッセージ例:
error: package org.apache.commons.lang3 does not exist原因として多いパターンはこちらです。
import文のパッケージ名が間違っている- 依存ライブラリがプロジェクトに追加されていない
- クラスパスの設定が不足している
// NG例:ライブラリが未追加なのにimportしている
import org.apache.commons.lang3.StringUtils;
// 対処法(Mavenの場合):pom.xmlに依存を追加
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.17.0</version>
</dependency>MavenやGradleを使っているなら、依存関係の追加で解決します。コマンドラインでjavacを直接使っている場合は、-cpオプションでクラスパスにJARファイルのパスを指定する必要があります。
Javaコンパイルエラーの解決手順【ステップ別】
エラーが出たとき、「どこを見ればいいかわからない」と感じる人が多いです。でも手順を知っていれば、系統立てて対処できます。
エラーメッセージは「呪文」ではなく「診断書」です。読み方を一度覚えれば、大半のエラーは自力で解決できるようになります。
現場でも、エラーメッセージを読まずにコード全体を書き直す人を何度も見てきました。しかし実際のところ、Javaのコンパイルエラーメッセージは「ファイル名」「行番号」「エラーの種類」の3つしか情報がありません。この3つだけ見れば、原因の9割は特定できます。
エラーメッセージの正しい読み方
コンパイルエラーのメッセージには、必ず以下の情報が含まれています。
- ファイル名と行番号 - どこのコードが問題かを示す
- エラーの種類 -
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で動作確認してから始めると安心です。
設定ファイルの修正後は、ターミナルを再起動して反映させることも忘れずに。
VSCode・Eclipseでコンパイルエラーが消えないときの対処法
コードを修正したのにIDEのエラー表示が消えない場合は、IDE側のキャッシュや設定が原因の可能性があります。
VSCodeの場合:
- 「Extension Pack for Java」がインストールされているか確認する
settings.jsonのjava.jdt.ls.java.homeにJDKパスが正しく設定されているか確認する- コマンドパレット(Ctrl+Shift+P)→「Java: Clean Java Language Server Workspace」でキャッシュを削除する
Eclipseの場合:
- メニューの「Project」→「Clean」でプロジェクトをクリーンビルドする
- 「Build Path」→「Configure Build Path」でJREバージョンがプロジェクトと一致しているか確認する
- ワークスペースの
.metadataフォルダを削除して再インポートする(最終手段)
どのIDEでも共通して「キャッシュの削除→再ビルド」で解消するケースが多いです。それでもダメならJDKのバージョンとプロジェクト設定の不一致を疑いましょう。
Javaコンパイルエラーを未然に防ぐ予防策
コンパイルエラーへの対処法を覚えることも大切ですが、そもそもエラーを出しにくいコーディングの習慣を持つ方が、長期的には効率が上がります。エラーを直す時間より、エラーを出さない仕組みを作る時間の方が価値があります。
コーディング中にミスを減らすテクニック
エラーを減らすためにすぐ実践できる習慣を紹介します。
1. IDEのコード補完を積極的に使う
変数名・メソッド名は手入力せず、補完機能(Ctrl+Space)で入力します。スペルミスによるcannot find symbolエラーが劇的に減ります。
2. 小さい単位でコンパイルする
機能を全部実装してからコンパイルするのではなく、数十行書いたらこまめにコンパイルします。エラーの発生箇所を特定しやすくなります。
3. 括弧は開いたらすぐ閉じる
{を書いたら即座に}も書く習慣をつけます。IDEは自動補完してくれますが、手動で書く場合は特に意識しましょう。
4. 命名規則を一貫させる
変数名・クラス名の命名規則(Javaならキャメルケース)を統一して使います。userNameとusernameの混在を防ぎ、cannot find symbolを出しにくくなります。
実務でも、私はコードレビューで「このメソッド名、何をするのかわからない」と指摘を受けたことがあります。doProcess()というメソッド名をapplyDiscountIfEligible()に変えたところ、コメントが不要になりました。意味のある命名はcannot find symbolの防止だけでなく、コード全体の品質を底上げします。
コードレビューとテストで品質を高める
個人開発では特に、自分のコードを客観視する機会が少なくなりがちです。コードレビューを取り入れると、自分では気づかないミスパターンを発見できます。チーム開発なら、PRを出す前にほかのメンバーにレビューを依頼しましょう。
個人開発の場合は、静的解析ツールを活用する方法があります。
| ツール名 | 用途 |
|---|---|
| Checkstyle | コーディング規約のチェック |
| SpotBugs | バグパターンの検出 |
| SonarQube | 総合的なコード品質管理 |
Checkstyle・SpotBugs・SonarQubeをビルドプロセスに組み込んでおくと、人間が見落としがちなエラーをあらかじめ検出できます。最初は設定が少し面倒ですが、一度整えると長期的に効いてきます。
Javaコンパイルエラーのよくある質問(FAQ)
Q. コンパイルエラーと実行時エラーはどちらを先に直すべき?
コンパイルエラーを先に直してください。コンパイルエラーが残っている状態ではプログラム自体が実行できないため、実行時エラーの確認すらできません。コンパイルを通してから、実行時エラーに取り組む順番が基本です。
Q. コンパイルエラーが大量に出たときはどうすればいい?
最初の1つだけを直してから再コンパイルしてください。Javaでは、1つのエラーが原因で連鎖的に別のエラーが発生することがよくあります。最初のエラーを解消するだけで、後続のエラーが一気に消えるケースは珍しくありません。
Q. 文字化けでコンパイルエラーになるのはなぜ?
ソースファイルのエンコーディングとjavacが想定するエンコーディングが一致していないことが原因です。日本語を含むソースコードでは、ファイルをUTF-8で保存したうえでjavac -encoding UTF-8 Main.javaのようにエンコーディングを明示すると解消します。IDEを使っている場合は、プロジェクト設定のエンコーディングをUTF-8に統一しましょう。
まとめ:コンパイルエラーは怖くない
Javaのコンパイルエラーについて、種類・原因・解決方法をまとめました。
| エラー | 主な原因 | 解決のポイント |
|---|---|---|
';' expected | セミコロン忘れ | 行末を確認 |
cannot find symbol | 宣言・スペルミス | 変数宣言とスコープを確認 |
incompatible types | 型の不一致 | 型変換メソッドを使う |
| クラス名不一致 | ファイル名とクラス名がズレている | 両方を統一する |
package does not exist | 依存ライブラリ未追加 | Maven/Gradleで依存を追加 |
コンパイルエラーは「コンパイラからの親切なフィードバック」です。エラーメッセージを読む習慣と、IDEを活用する環境を整えれば、ほとんどのコンパイルエラーは数分以内に解決できます。
「エラーが出るのは当たり前」くらいの気持ちで向き合うと、だいぶ楽になります。最初は戸惑っても、パターンを知れば知るほど対処が速くなるので、焦らず一つひとつ潰していきましょう。
