【Java】「シンボルを見つけられません」エラーの原因7つと解決方法

Javaプログラミング中に「シンボルを見つけられません(cannot find symbol)」というコンパイルエラーに遭遇したことはありませんか?

このエラーはJava初心者がもっともよく直面するエラーの一つで、変数・メソッド・クラスなどのシンボル(名前)をコンパイラが解決できないときに発生します。

この記事では、エラーの意味から7つの主要な原因と解決方法IDE別の対処法Maven/Gradleでの依存関係問題まで、実務で使える知識を網羅的に解説します。

スポンサーリンク

「シンボルを見つけられません」エラーとは

cannot find symbol(シンボルを見つけられません)は、Javaコンパイラがソースコード中の識別子(シンボル)を認識できない場合に発生するコンパイルエラーです。

エラーメッセージは以下のような形式で表示されます。

エラーメッセージ例
error: cannot find symbol
  symbol:   variable myVariable
  location: class Main

エラーメッセージの読み方

  • symbol:見つからなかったシンボルの種類と名前(variable, method, class など)
  • location:そのシンボルが探された場所(クラス名やパッケージ名)

このエラーが発生する主な原因は以下のとおりです。

原因 概要
タイプミス 変数名・メソッド名の綴りや大文字小文字の間違い
変数の未宣言 使おうとしている変数が宣言されていない
import文の不足 必要なクラスがインポートされていない
スコープ外アクセス 変数の有効範囲外からアクセスしている
ライブラリの不足 必要な依存関係がプロジェクトに含まれていない
ビルドパスの問題 クラスパスやビルド設定が正しくない
静的アクセスの誤り staticメソッド/変数へのアクセス方法が間違っている

原因1:変数名・メソッド名のタイプミス(大文字小文字)

もっとも多い原因がシンボル名の綴り間違いです。Javaは大文字と小文字を厳密に区別する(case-sensitive)ため、1文字の違いでもエラーになります。

エラーが出るコード

Main.java(エラーあり)
public class Main {
    public static void main(String[] args) {
        String message = "Hello";
        System.out.println(mesage);  // NG: "mesage" は未定義
    }
}

修正方法

変数名を正しく "message" に修正する
System.out.println(message);  // OK

注意:Javaでは myVariableMyVariablemyvariable はすべて別のシンボルとして扱われます。命名規則に従って一貫した名前を使いましょう。

よくあるタイプミスの例

間違い 正しい名前 問題点
system.out.println System.out.println 先頭が小文字
string String クラス名は大文字で始まる
arreyList ArrayList 綴りと大文字小文字の両方が間違い
Length() length() メソッド名は小文字で始まる
gettext() getText() キャメルケースの大文字が抜けている

原因2:変数の未宣言

変数を宣言せずに使おうとした場合や、宣言より前に使った場合にエラーが発生します。

宣言し忘れているケース

Main.java(エラーあり)
public class Main {
    public static void main(String[] args) {
        // int count = 10; を書き忘れ
        System.out.println(count);  // NG: count が未宣言
    }
}

修正後のコード

Main.java(修正済み)
public class Main {
    public static void main(String[] args) {
        int count = 10;  // 変数を宣言
        System.out.println(count);  // OK: 10 が出力される
    }
}

実行結果

10

原因3:import文の不足

java.lang パッケージ以外のクラスを使う場合は、import文で明示的にインポートする必要があります。import文がないと「シンボルを見つけられません」エラーになります。

エラーが出るコード

Main.java(import不足)
// import java.util.ArrayList; が不足!

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();  // NG
    }
}

修正後のコード

Main.java(修正済み)
import java.util.ArrayList;  // import文を追加

public class Main {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();  // OK
        list.add("Hello");
        System.out.println(list);  // [Hello]
    }
}

よく忘れがちなimport文

クラス名 import文
ArrayList import java.util.ArrayList;
HashMap import java.util.HashMap;
Scanner import java.util.Scanner;
Arrays import java.util.Arrays;
List import java.util.List;
Map import java.util.Map;
IOException import java.io.IOException;
LocalDate import java.time.LocalDate;

ポイント:java.lang パッケージのクラス(StringIntegerSystem など)はimport不要です。それ以外のパッケージのクラスには必ずimport文が必要です。

原因4:スコープ外からのアクセス

変数は宣言されたブロック({} の範囲)内でのみ有効です。if文やforループの中で宣言した変数をブロックの外から参照するとエラーになります。

エラーが出るコード

Main.java(スコープ外アクセス)
public class Main {
    public static void main(String[] args) {
        if (true) {
            String result = "成功";
        }
        System.out.println(result);  // NG: result はifブロックの外
    }
}

修正後のコード

Main.java(修正済み)
public class Main {
    public static void main(String[] args) {
        String result = "";  // ブロックの外で宣言
        if (true) {
            result = "成功";  // ブロック内で代入
        }
        System.out.println(result);  // OK: "成功" が出力される
    }
}

forループでよくある間違い

ループ変数のスコープ
// NG: i はforブロック内のみ有効
for (int i = 0; i < 5; i++) {
    System.out.println(i);
}
System.out.println(i);  // NG: cannot find symbol

// OK: ループの外で宣言
int i;
for (i = 0; i < 5; i++) {
    System.out.println(i);
}
System.out.println(i);  // OK: 5 が出力される

原因5:ライブラリ/依存関係の不足

外部ライブラリのクラスを使用しているのに、そのライブラリがプロジェクトの依存関係に含まれていない場合にエラーが発生します。

よくある例

ライブラリ未追加のエラー例
import com.google.gson.Gson;  // Gsonライブラリが必要

public class Main {
    public static void main(String[] args) {
        Gson gson = new Gson();  // NG: Gsonがクラスパスにない
    }
}

解決方法

ビルドツールの設定ファイルにライブラリの依存関係を追加します。

pom.xml(Mavenの場合)
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>
build.gradle(Gradleの場合)
dependencies {
    implementation 'com.google.code.gson:gson:2.10.1'
}

原因6:ビルドパスの問題

コード自体は正しくても、ビルドパス(クラスパス)の設定が正しくない場合にエラーが発生することがあります。

主なケース

ビルドパスの問題が発生するケース

  • JARファイルがクラスパスに含まれていない:手動でJARを追加するプロジェクトで発生
  • ソースファイルのディレクトリ構成が不正:パッケージ宣言とディレクトリが一致しない
  • コンパイル済みクラスが古い:ビルドキャッシュが残っている
  • JDKバージョンの不一致:新しいAPIを古いJDKでコンパイルしている

パッケージとディレクトリの不一致例

ディレクトリ構造の確認
// ファイル: src/main/java/com/example/MyClass.java
package com.example;  // パッケージ名とディレクトリが一致すること

// NG: src/MyClass.java に置いて package com.example; と宣言
// OK: src/main/java/com/example/MyClass.java に配置

ビルドキャッシュのクリア方法

ビルドキャッシュクリアコマンド
# Maven
mvn clean compile

# Gradle
gradle clean build

# 手動コンパイル
javac -d out src/com/example/*.java

原因7:静的メソッド/変数のアクセスミス

static(静的)なメソッドや変数を、インスタンスから呼び出す、または逆にインスタンスメソッドをクラス名から呼び出す場合にエラーが発生することがあります。

エラーが出るコード

静的アクセスの誤り
public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        // NG: add() はインスタンスメソッドなのにクラス名で呼んでいる
        int result = Calculator.add(3, 5);
    }
}

修正方法:2つのアプローチ

方法1:インスタンスを作成して呼び出す
Calculator calc = new Calculator();
int result = calc.add(3, 5);  // OK: インスタンス経由
方法2:メソッドをstaticにする
public class Calculator {
    public static int add(int a, int b) {  // static を追加
        return a + b;
    }
}

// これでクラス名から直接呼び出せる
int result = Calculator.add(3, 5);  // OK

IDE別の対処法

主要なJava開発環境での「シンボルを見つけられません」エラーの対処方法を紹介します。

Eclipse

Eclipseでの対処手順

  • import文の自動追加Ctrl + Shift + O(Organize Imports)でimport文を自動整理
  • クイックフィックス:エラー箇所にカーソルを合わせて Ctrl + 1 で修正候補を表示
  • プロジェクトのクリーン:メニューの [Project] → [Clean…] でビルドキャッシュをクリア
  • ビルドパスの確認:プロジェクト右クリック → [Properties] → [Java Build Path] で依存関係を確認
  • JDKの確認:[Window] → [Preferences] → [Java] → [Installed JREs] でJDKバージョンを確認

IntelliJ IDEA

IntelliJ IDEAでの対処手順

  • import文の自動追加Alt + Enter でimport候補を表示し選択
  • 自動インポート設定:[Settings] → [Editor] → [General] → [Auto Import] で自動インポートを有効化
  • キャッシュの無効化:[File] → [Invalidate Caches / Restart] でキャッシュをクリア
  • Maven/Gradleの再読み込み:pom.xml/build.gradle を右クリック → [Reload Project]
  • プロジェクト構造の確認Ctrl + Alt + Shift + S でモジュール・ライブラリの設定を確認

VS Code(Extension Pack for Java)

VS Codeでの対処手順

  • import文の自動追加:エラー箇所で Ctrl + . を押してクイックフィックスを実行
  • Java Language Serverのリセット:コマンドパレット(Ctrl + Shift + P)→ “Java: Clean Java Language Server Workspace”
  • ワークスペースのクリーン:コマンドパレット → “Java: Force Java Compilation” → “Full”
  • JDK設定の確認settings.jsonjava.jdt.ls.java.home を確認

Maven/Gradleでの依存関係問題

ビルドツールを使用しているプロジェクトで「シンボルを見つけられません」エラーが出る場合、依存関係の設定に問題がある可能性があります。

Maven:よくある問題と解決方法

問題 解決コマンド
依存関係がダウンロードされていない mvn dependency:resolve
ローカルリポジトリが壊れている mvn dependency:purge-local-repository
コンパイルキャッシュが古い mvn clean compile
依存関係ツリーの確認 mvn dependency:tree
Maven強制更新コマンド
# 依存関係を強制再ダウンロード
mvn clean install -U

# SNAPSHOTの更新を強制
mvn clean compile -U

Gradle:よくある問題と解決方法

問題 解決コマンド
依存関係のリフレッシュ gradle --refresh-dependencies
ビルドキャッシュのクリア gradle clean build
依存関係の一覧表示 gradle dependencies

注意:Maven/Gradleの scope 設定にも注意してください。<scope>test</scope> で追加した依存関係は、テストコード以外では使えません。本番コードで使う場合は compile(Maven)または implementation(Gradle)を指定してください。

よくあるパターンと解決策

実際の開発でよく遭遇する「シンボルを見つけられません」エラーのパターンと、その解決方法を一覧にまとめました。

エラーパターン 原因 解決方法
symbol: variable xxx 変数の未宣言またはタイプミス 変数名を確認・宣言する
symbol: method xxx() メソッド名の誤りまたは引数の型が違う メソッド名・引数の型を確認する
symbol: class Xxx import不足またはクラスが存在しない import文を追加する
location: class Main 他クラスのメンバーへの不正アクセス アクセス修飾子・static修飾子を確認する
コンパイルは通るがIDEでエラー IDEのキャッシュが古い キャッシュをクリアして再ビルドする
特定のクラスだけエラー 依存関係の不足 pom.xml/build.gradleに追加する
全ファイルで大量のエラー JDKパスの設定ミス JAVA_HOME環境変数を確認する
別モジュールのクラスでエラー モジュール間の依存関係が未設定 module-info.java または依存設定を追加する

デバッグのコツ

「シンボルを見つけられません」エラーを効率的に解決するためのコツを紹介します。

1. エラーメッセージを正確に読む

エラーメッセージの読み方
Main.java:10: error: cannot find symbol
        System.out.println(mesage);
                           ^
  symbol:   variable mesage      ← 見つからないシンボル名
  location: class Main           ← どのクラスで探したか

ポイント:symbol の行で「何が」見つからないか、location の行で「どこで」探したかがわかります。この2つの情報を元に原因を特定しましょう。

2. チェックリスト

エラーに遭遇したら、以下の順番で確認すると効率的です。

デバッグチェックリスト

  • シンボル名の綴りに間違いはないか?(大文字小文字を含む)
  • 変数は使用前に宣言されているか?
  • 変数のスコープ内からアクセスしているか?
  • 必要なimport文があるか?
  • クラス名・メソッド名は正しいか?(Java APIドキュメントで確認)
  • 外部ライブラリの依存関係は設定されているか?
  • ビルドパス/クラスパスは正しいか?
  • IDEのキャッシュが古くなっていないか?

3. コンパイルオプションで詳細情報を得る

詳細なエラー情報を表示
# クラスパスを明示的に指定してコンパイル
javac -cp "lib/*:." Main.java

# 詳細なエラー情報を表示(-Xlint オプション)
javac -Xlint:all Main.java

# ソースパスを明示的に指定
javac -sourcepath src -d out src/com/example/Main.java

4. よくある罠に注意

注意:以下の「よくある罠」にも気をつけましょう。

説明
ファイル名とクラス名の不一致 publicクラスのクラス名とファイル名は一致させる必要がある(Main.javaclass Main
セミコロンの付け忘れ 前の行のセミコロン忘れが、次の行のシンボルエラーとして表示されることがある
ジェネリクスの型消去 ListList<String> の混同でエラーが出ることがある
古いコンパイル結果の残留 ソースを修正してもclassファイルが更新されていない場合がある
Java バージョン固有のAPI Java 11以降の var をJava 8でコンパイルするとエラーになる

まとめ

Javaの「シンボルを見つけられません(cannot find symbol)」エラーは、コンパイラがソースコード中のシンボルを解決できない場合に発生するコンパイルエラーです。

原因 確認すること 対処法
タイプミス 綴り・大文字小文字 正しい名前に修正する
変数の未宣言 宣言の有無と位置 使用前に変数を宣言する
import文の不足 必要なimport文の有無 import文を追加する
スコープ外アクセス 変数の有効範囲 スコープの外で宣言する
ライブラリの不足 依存関係の設定 pom.xml/build.gradleに追加する
ビルドパスの問題 クラスパス・ディレクトリ構造 設定を修正しクリーンビルドする
静的アクセスの誤り static修飾子の有無 呼び出し方法を修正する

エラーが発生したら、まずエラーメッセージの symbol と location を確認し、上記のチェックリストに沿って原因を特定しましょう。IDEの機能(自動インポート、クイックフィックスなど)を活用すれば、多くのケースは素早く解決できます。