Javaを書いていて、コンパイルエラーが出るたびに手が止まっていませんか?英語のエラーメッセージを見て「何が原因かわからない」と困った経験は、Java初心者なら誰でもあるはずです。
Javaのコンパイルエラーとは、javacがソースコードをバイトコードに変換する段階で見つけた、文法や型のミスのことです。
実は、出てくるエラーのパターンは決まっています。
セミコロン忘れ・cannot find symbol・型の不一致・クラス名不一致・パッケージ未検出の5つを押さえるだけで、エラーの大半は自力で解決できるようになります。
この記事では、よくあるコンパイルエラー5パターンの原因と解決コードを一覧で紹介し、実行時エラーとの違い・IDEを使った効率的なデバッグ方法・エラーを出さない予防策まで体系的に解説します。
この記事でわかること
- よくあるコンパイルエラー5パターンの原因と直し方
- コンパイルエラーと実行時エラーの違い
- エラーメッセージの読み方と、IDEを使った効率的な直し方
- エラーを出さないための予防策とチェックリスト
PARTS LIST /目次
Javaのコンパイルエラーとは?実行時エラーとの違い
Javaのエラーには大きく2種類あります。コンパイルエラーと実行時エラーです。この2つを混同していると、エラーへの対処が的外れになりがちです。
まずここを整理しておきましょう。
コンパイルエラーは、書いたコードをコンパイル(ソースコードをコンピュータが実行できる形式に変換する処理)するときに検出されるエラーです。
つまり「プログラムを動かす前に発見できるミス」です。
IDEを使っているなら、コードを書いている段階で赤い波線が出て教えてくれます。
コマンドラインでjavacを実行したときにエラーが出るケースも、これに該当します。
コンパイルエラーの最大の特徴は「実行前に見つかる」点です。言い方を変えれば、プログラムがそもそも動き出せない状態です。
早い段階でミスを教えてくれる親切なエラーです。
コンパイルエラーが発生する仕組み
Javaはコンパイル言語なので、ソースコード(.javaファイル)を一度バイトコード(.classファイル)に変換してから実行します。
この変換処理がコンパイルです。
コンパイル時、Javaコンパイラは構文の正しさ・型の整合性・クラスやメソッドの存在確認などを行います。
これらのチェックで問題が見つかると、コンパイルが中断されてエラーメッセージが表示されます。
コンパイルエラーはコンパイラが「このコードは実行できませんよ」と教えてくれているメッセージです。怖がらずに、まずメッセージを読んでみましょう。
実行時エラーとの根本的な違い
実行時エラー(プログラムの実行中に発生する例外やエラー)は、コンパイルを通過して実際にプログラムを動かしたときに発生するエラーです。
代表的なものにNullPointerExceptionやArrayIndexOutOfBoundsExceptionがあります。
コンパイルエラーとの最大の違いは「コードが動いてしまう」点です。
文法的には正しいコードでも、実行中に予期しない状況(nullのオブジェクトへのアクセスなど)が起きると実行時エラーになります。
コンパイルエラーの方が発見は早く、「親切なエラー」といえます。実行時エラーと区別してつきあえるようになると、Javaの理解がぐっと深まります。
実行時エラーも含めたJavaのエラー全般についてはJavaエラー原因と対処法9選|初心者向け完全ガイドで網羅的に解説しています。
よくあるJavaコンパイルエラー一覧と原因
Javaでよく遭遇するコンパイルエラーを5種類に絞って解説します。
それぞれのエラーメッセージと、起きる原因・解決策をセットで覚えておくと、次からはすぐに直せるようになります。
文法エラー(セミコロン・括弧)
最も多いのが、単純な文法ミスです。
エラーメッセージ例:error: ';' expected
error: reached end of file while parsing
主な原因は以下の2つです。
- 文末のセミコロン(
;)が抜けている - 波括弧(
{})の対応がずれている
// NG例:セミコロンが抜けている
System.out.println("Hello World")
// OK例
System.out.println("Hello World");
括弧のズレは、ネストが深くなるほど発見しにくくなります。IDEのブラケット強調表示機能を使うと一目でわかるので、積極的に活用しましょう。
エラーメッセージに^マークが付いていれば、そこが問題箇所のヒントになっています。焦らず、まず^の位置を確認するのが近道です。
reached end of file while parsingは「ファイルの終わりまで読んだが、まだ閉じられていない構文がある」という意味のエラーです。
多くの場合、波括弧{}の閉じ忘れが原因で、コンパイラがクラスやメソッドの終わりを見つけられずファイル末尾まで到達してしまった状態を示しています。
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ブロック内で宣言した変数をブロック外から参照しようとして、なぜエラーになるのかわからず何時間も悩みました。
スコープは「変数の寿命」と考えると理解しやすくなります。
cannot find symbolのより詳しいパターンと解決コードはJava「シンボルを見つけられません」原因7つと解決コード例で解説しています。
incompatible types(型の不一致)
型が合っていないときに出るエラーです。
エラーメッセージ例:error: incompatible types: String cannot be converted to int
Javaは静的型付け言語なので、型の扱いが厳格です。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に次の依存関係を追加します。
<!-- 対処法(Mavenの場合):pom.xmlに依存を追加 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.20.0</version>
</dependency>
MavenやGradleを使っているなら、依存関係の追加で解決します。
コマンドラインでjavacを直接使っている場合は、-cpオプションでクラスパスにJARファイルのパスを指定する必要があります。
クラスパスの仕組みや確認方法を詳しく知りたい場合はJavaクラスパス完全ガイド!確認方法と設定方法を参照してください。
missing return statement・unreported exceptionなど、その他のエラー
5つの型に当てはまらないメッセージも、初心者のうちはよく目にします。代表的な2つを押さえておきましょう。
Javaコンパイルエラーの解決手順【ステップ別】
エラーが出たとき、「どこを見ればいいかわからない」と感じる人が多いです。でも手順を知っていれば、系統立てて対処できます。
エラーメッセージは「呪文」ではなく「診断書」です。読み方を一度覚えれば、大半のエラーは自力で解決できるようになります。
現場でも、エラーメッセージを読まずにコード全体を書き直す人を何度も見てきました。
しかし実際のところ、Javaのコンパイルエラーメッセージで最初に見るべき情報は「ファイル名」「行番号」「エラーの種類」の3つだけです。
この3つを見れば、原因の見当はたいていつきます。解決までの流れを図にすると、次のようになります。
';' expected文法エラーcannot find symbolincompatible typespublic class ... should be declared in a file namedpackage does not existエラーメッセージの正しい読み方
コンパイルエラーのメッセージには、以下の情報が含まれています。
- ファイル名と行番号 - どこのコードが問題かを示す
- エラーの種類 -
cannot find symbolや';' expectedなど - 補足情報 - 問題の変数名や型名など
Main.java:10: error: ';' expected
System.out.println("Hello")
^
この例では「Main.javaの10行目、セミコロンが必要」とそのまま書いてあります。なお、この記事のエラーメッセージは英語表示のものです。日本語環境のJDKでは「エラー: ';'がありません」のように日本語で表示されることがありますが、ファイル名・行番号・^の位置という構成は同じです。
複数のエラーが出たときは、最初のエラーから順に直していくのがコツです。
最初のエラーが原因で連鎖的に別のエラーが出ているケースが多いため、上から1つずつ対処するのが効率的です。
全部を一気に直そうとすると、どこが本当の原因かわからなくなります。
IDEを使った効率的なデバッグ
IntelliJ IDEA や Eclipse などのIDEを使うと、コンパイルエラーの解決がかなり楽になります。
主なメリットは以下のとおりです。
- リアルタイム検知 - コードを書きながら赤い波線でエラーを表示
- クイックフィックス - Alt+Enterなどのショートカットで修正候補を提案
- 補完機能 - 変数名・メソッド名のスペルミスを防ぐ
私の場合、IntelliJ IDEAを使い始めてから「セミコロン忘れ」や「スペルミス」によるエラーがほぼゼロになりました。
IDEは入力ミスを未然に防いでくれる強力なツールです。
まだテキストエディタでコードを書いているなら、IDEへの移行を強くすすめます。
特にIntelliJ IDEAはJava開発との相性がよく、2025.3以降は統合版に一本化され、サブスクリプションなしでもJavaの開発に必要な基本機能が使えます(2026年9月時点)。
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」でキャッシュを削除する
- メニューの「Project」→「Clean」でプロジェクトをクリーンビルドする
- 「Build Path」→「Configure Build Path」でJREバージョンがプロジェクトと一致しているか確認する
- ワークスペースの
.metadataフォルダを削除して再インポートする(最終手段)
どのIDEでも共通して「キャッシュの削除→再ビルド」で解消するケースが多いです。
それでもダメならJDKのバージョンとプロジェクト設定の不一致を疑いましょう。
Javaコンパイルエラーを未然に防ぐ予防策
コンパイルエラーへの対処法を覚えることも大切ですが、そもそもエラーを出しにくいコーディングの習慣を持つ方が、長期的には効率が上がります。
エラーを直す時間より、エラーを出さない仕組みを作る時間の方が価値があります。
コーディング中にミスを減らすテクニック
エラーを減らすためにすぐ実践できる習慣を紹介します。
1. IDEのコード補完を積極的に使う変数名・メソッド名は手入力せず、補完機能(Ctrl+Space)で入力します。
スペルミスによるcannot find symbolエラーが劇的に減ります。
機能を全部実装してからコンパイルするのではなく、数十行書いたらこまめにコンパイルします。エラーの発生箇所を特定しやすくなります。
3. 括弧は開いたらすぐ閉じる{を書いたら即座に}も書く習慣をつけます。IDEは自動補完してくれますが、手動で書く場合は特に意識しましょう。
変数名・クラス名の命名規則(Javaならキャメルケース)を統一して使います。
userNameとusernameの混在を防ぎ、cannot find symbolを出しにくくなります。
実務でも、私はコードレビューで「このメソッド名、何をするのかわからない」と指摘を受けたことがあります。
doProcess()というメソッド名をapplyDiscountIfEligible()に変えたところ、コメントが不要になりました。
意味のある命名はcannot find symbolの防止だけでなく、コード全体の品質を底上げします。
コードレビューとテストで品質を高める
個人開発では特に、自分のコードを客観視する機会が少なくなりがちです。コードレビューを取り入れると、自分では気づかないミスパターンを発見できます。
チーム開発なら、PRを出す前にほかのメンバーにレビューを依頼しましょう。
個人開発の場合は、静的解析ツールを活用する方法があります。
Checkstyle・SpotBugs・SonarQubeをビルドプロセスに組み込んでおくと、人間が見落としがちなエラーをあらかじめ検出できます。
最初は設定が少し面倒ですが、一度整えると長期的に効いてきます。
Javaコンパイルエラーのよくある質問(FAQ)
Q1. コンパイルエラーと実行時エラーはどちらを先に直すべき?
A1. コンパイルエラーを先に直してください。コンパイルエラーが残っている状態ではプログラム自体が実行できないため、実行時エラーの確認すらできません。コンパイルを通してから、実行時エラーに取り組む順番が基本です。
Q2. コンパイルエラーが大量に出たときは、どこから直せばいい?
A2. 最初の1つだけを直してから再コンパイルしてください。Javaでは、1つのエラーが原因で連鎖的に別のエラーが発生することがよくあります。最初のエラーを解消するだけで、後続のエラーが一気に消えるケースは珍しくありません。
Q3. 文字化けでコンパイルエラーになるのはなぜ?
A3. ソースファイルのエンコーディングとjavacが想定するエンコーディングが一致していないことが原因です。日本語を含むソースコードでは、ファイルをUTF-8で保存したうえでjavac -encoding UTF-8 Main.javaのようにエンコーディングを明示すると解消します。JDK 18以降はjavacの既定エンコーディングがUTF-8になったため、Shift_JISなどで保存した古いソースファイルを開いたときに起きやすくなっています。IDEを使っている場合は、プロジェクト設定のエンコーディングをUTF-8に統一しましょう。
コンパイル前に確認したいチェックリスト5項目
コードを書き終えてコンパイルする前に、以下の5項目をざっと見返すだけで、よくあるコンパイルエラーの大半を未然に防げます。
- セミコロン(
;)・波括弧({})の対応漏れがないか - 変数名・メソッド名のスペル、大文字小文字が一致しているか
- ファイル名とpublicクラス名が一致しているか
- importしているクラスが依存関係(pom.xml・build.gradle等)に含まれているか
- 型変換(String⇔int等)が必要な箇所を素通りしていないか
まとめ:コンパイルエラーは怖くない
Javaのコンパイルエラーについて、種類・原因・解決方法をまとめました。
コンパイルエラーは「コンパイラからの親切なフィードバック」です。
エラーメッセージを読む習慣と、IDEを活用する環境を整えれば、ほとんどのコンパイルエラーは数分以内に解決できます。
「エラーが出るのは当たり前」くらいの気持ちで向き合うと、だいぶ楽になります。
最初は戸惑っても、パターンを知れば知るほど対処が速くなるので、焦らず一つひとつ潰していきましょう。
| REV. | DATE | 内容 |
|---|---|---|
| 7 | 2026-10-16 | 図解を描き直し(図面のデザインにそろえた) |
| 6 | 2026-10-14 | 雰囲気だけの挿絵を外し、図解に置き換え |
| 5 | 2026-10-04 | 記載内容の事実確認と修正 |
| 4 | 2026-09-22 | 2026年9月時点の情報で全体を見直し |
| … ほか2回の改訂 | ||
| 1 | 2026-03-28 | 初版 |





