本ページはプロモーションが含まれています

Java入門

Javaコンパイルエラーとは?原因5選・解決法

CATEGORY
REV.
DRAWN BY
TOM
SHEETS
7枚
javac error(コンパイルエラーの原因5選)

トム

SESで約8年、環境を変えられないもどかしさの中にいました。32歳で自社開発企業に転職し、今はClaude Codeと自動化で、仕事も時間も組み直している途中です。
・Javaバックエンドエンジニア(Java歴12年以上)
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎
詳細なプロフィール

𝕏

Javaを書いていて、コンパイルエラーが出るたびに手が止まっていませんか?英語のエラーメッセージを見て「何が原因かわからない」と困った経験は、Java初心者なら誰でもあるはずです。

Javaのコンパイルエラーとは、javacがソースコードをバイトコードに変換する段階で見つけた、文法や型のミスのことです。

実は、出てくるエラーのパターンは決まっています。

セミコロン忘れ・cannot find symbol・型の不一致・クラス名不一致・パッケージ未検出の5つを押さえるだけで、エラーの大半は自力で解決できるようになります。

この記事では、よくあるコンパイルエラー5パターンの原因と解決コードを一覧で紹介し、実行時エラーとの違い・IDEを使った効率的なデバッグ方法・エラーを出さない予防策まで体系的に解説します。

この記事でわかること

  • よくあるコンパイルエラー5パターンの原因と直し方
  • コンパイルエラーと実行時エラーの違い
  • エラーメッセージの読み方と、IDEを使った効率的な直し方
  • エラーを出さないための予防策とチェックリスト

Javaのコンパイルエラーとは?実行時エラーとの違い

Javaのコードが動くまでの流れと、2種類のエラーが起きる段階
1
SOURCE / ソースコードMain.java
2
BYTECODE / バイトコードMain.class
3
RUN / 実行プログラムが動く結果が出る
1 → 2 の間 / javacコンパイルエラー文法・型・宣言の誤りが見つかる。.classファイルは作られず、実行まで進まない
3 の途中 / 実行中実行時エラーコンパイルは通り、動かしている途中で起きる。例:NullPointerException

Javaのエラーには大きく2種類あります。コンパイルエラーと実行時エラーです。この2つを混同していると、エラーへの対処が的外れになりがちです。

まずここを整理しておきましょう。

コンパイルエラーは、書いたコードをコンパイル(ソースコードをコンピュータが実行できる形式に変換する処理)するときに検出されるエラーです。

つまり「プログラムを動かす前に発見できるミス」です。

IDEを使っているなら、コードを書いている段階で赤い波線が出て教えてくれます。

コマンドラインでjavacを実行したときにエラーが出るケースも、これに該当します。

コンパイルエラーの最大の特徴は「実行前に見つかる」点です。言い方を変えれば、プログラムがそもそも動き出せない状態です。

早い段階でミスを教えてくれる親切なエラーです。

コンパイルエラーが発生する仕組み

Javaはコンパイル言語なので、ソースコード(.javaファイル)を一度バイトコード(.classファイル)に変換してから実行します。

この変換処理がコンパイルです。

コンパイル時、Javaコンパイラは構文の正しさ・型の整合性・クラスやメソッドの存在確認などを行います。

これらのチェックで問題が見つかると、コンパイルが中断されてエラーメッセージが表示されます。

コンパイルエラーはコンパイラが「このコードは実行できませんよ」と教えてくれているメッセージです。怖がらずに、まずメッセージを読んでみましょう。

実行時エラーとの根本的な違い

実行時エラー(プログラムの実行中に発生する例外やエラー)は、コンパイルを通過して実際にプログラムを動かしたときに発生するエラーです。

代表的なものにNullPointerExceptionやArrayIndexOutOfBoundsExceptionがあります。

コンパイルエラーとの最大の違いは「コードが動いてしまう」点です。

文法的には正しいコードでも、実行中に予期しない状況(nullのオブジェクトへのアクセスなど)が起きると実行時エラーになります。

比較項目コンパイルエラー実行時エラー
発生タイミングコンパイル時実行時
主な原因文法・型の誤りロジックの誤り
見つけやすさIDEが即座に指摘実際に動かして発見
対処難易度比較的低い場合によっては難しい

コンパイルエラーの方が発見は早く、「親切なエラー」といえます。実行時エラーと区別してつきあえるようになると、Javaの理解がぐっと深まります。

エラーが見つかるタイミングの違い(段階ごとの結果)
STAGE / 段階
コンパイルエラー
実行時エラー
.javaソースコード
作成
作成
javac文法・型をチェック
✗ 停止ミスがあると変換が中断される
✓ 通過
.class
作られない
✓ 生成
実行
動かない
✗ 例外例:NullPointerException など
NOTEコンパイルエラーは「動かす前」に見つかる親切なエラー。実行時エラーは.classができたあと、動かしたときに起きます。

実行時エラーも含めた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つを押さえておきましょう。

エラーメッセージ意味対処
missing return statement戻り値のあるメソッドで、returnを通らない経路が残っているすべての分岐の末尾にreturnを書く
unreported exception ... must be caught or declared to be thrown検査例外を、try-catchもthrowsも付けずに呼び出しているtry-catchで捕捉するか、メソッドにthrowsを付ける
あわせて読む

Javaコンパイルエラーの解決手順【ステップ別】

エラーが出たとき、「どこを見ればいいかわからない」と感じる人が多いです。でも手順を知っていれば、系統立てて対処できます。

エラーメッセージは「呪文」ではなく「診断書」です。読み方を一度覚えれば、大半のエラーは自力で解決できるようになります。

現場でも、エラーメッセージを読まずにコード全体を書き直す人を何度も見てきました。

しかし実際のところ、Javaのコンパイルエラーメッセージで最初に見るべき情報は「ファイル名」「行番号」「エラーの種類」の3つだけです。

この3つを見れば、原因の見当はたいていつきます。解決までの流れを図にすると、次のようになります。

コンパイルエラーを解決するまでの流れ
1
ファイル名・行番号を確認コンパイルエラーが発生したら、まずここを見る
2
エラーの種類を確認種類ごとに、確認すること・直し方は下の表のとおり
MESSAGE / エラーの種類
確認すること・直し方
';' expected文法エラー
セミコロン・括弧を確認
cannot find symbol
宣言漏れ・スペルミス・スコープ外参照を確認
incompatible types
型変換メソッドで型を合わせる
public class ... should be declared in a file named
ファイル名とクラス名を一致させる
package does not exist
依存関係・import文・クラスパスを確認
3
再コンパイル
4
まだエラーが残っている?はい → 1 に戻る / いいえ → コンパイル成功

エラーメッセージの正しい読み方

コンパイルエラーのメッセージには、以下の情報が含まれています。

  1. ファイル名と行番号 - どこのコードが問題かを示す
  2. エラーの種類 - cannot find symbolや';' expectedなど
  3. 補足情報 - 問題の変数名や型名など
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」でキャッシュを削除する
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)

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のコンパイルエラーについて、種類・原因・解決方法をまとめました。

エラー主な原因解決のポイント
';' expectedセミコロン忘れ行末を確認
cannot find symbol宣言・スペルミス変数宣言とスコープを確認
incompatible types型の不一致型変換メソッドを使う
クラス名不一致ファイル名とクラス名がズレている両方を統一する
package does not exist依存ライブラリ未追加Maven/Gradleで依存を追加

コンパイルエラーは「コンパイラからの親切なフィードバック」です。

エラーメッセージを読む習慣と、IDEを活用する環境を整えれば、ほとんどのコンパイルエラーは数分以内に解決できます。

「エラーが出るのは当たり前」くらいの気持ちで向き合うと、だいぶ楽になります。

最初は戸惑っても、パターンを知れば知るほど対処が速くなるので、焦らず一つひとつ潰していきましょう。

REVISIONS / 改訂履歴
REV.DATE内容
72026-10-16図解を描き直し(図面のデザインにそろえた)
62026-10-14雰囲気だけの挿絵を外し、図解に置き換え
52026-10-04記載内容の事実確認と修正
42026-09-222026年9月時点の情報で全体を見直し
… ほか2回の改訂
12026-03-28初版
NEXT READ本棚から1本

AIで開発を組み直すなら、まずこの5冊から

入門・実践・設計まで、Claude Codeの本をレベル別に5冊選んで比べました。

→ おすすめ5冊を見る

  • この記事を書いた人
  • 最新記事

トム

SESで約8年、環境を変えられないもどかしさの中にいました。32歳で自社開発企業に転職し、今はClaude Codeと自動化で、仕事も時間も組み直している途中です。
・Javaバックエンドエンジニア(Java歴12年以上)
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎
詳細なプロフィール

𝕏

Java入門 ・