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では myVariable と MyVariable と myvariable はすべて別のシンボルとして扱われます。命名規則に従って一貫した名前を使いましょう。
よくあるタイプミスの例
| 間違い |
正しい名前 |
問題点 |
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 が出力される
}
}
原因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 パッケージのクラス(String、Integer、System など)は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.json の java.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.java に class Main) |
| セミコロンの付け忘れ |
前の行のセミコロン忘れが、次の行のシンボルエラーとして表示されることがある |
| ジェネリクスの型消去 |
List と List<String> の混同でエラーが出ることがある |
| 古いコンパイル結果の残留 |
ソースを修正してもclassファイルが更新されていない場合がある |
| Java バージョン固有のAPI |
Java 11以降の var をJava 8でコンパイルするとエラーになる |
まとめ
Javaの「シンボルを見つけられません(cannot find symbol)」エラーは、コンパイラがソースコード中のシンボルを解決できない場合に発生するコンパイルエラーです。
| 原因 |
確認すること |
対処法 |
| タイプミス |
綴り・大文字小文字 |
正しい名前に修正する |
| 変数の未宣言 |
宣言の有無と位置 |
使用前に変数を宣言する |
| import文の不足 |
必要なimport文の有無 |
import文を追加する |
| スコープ外アクセス |
変数の有効範囲 |
スコープの外で宣言する |
| ライブラリの不足 |
依存関係の設定 |
pom.xml/build.gradleに追加する |
| ビルドパスの問題 |
クラスパス・ディレクトリ構造 |
設定を修正しクリーンビルドする |
| 静的アクセスの誤り |
static修飾子の有無 |
呼び出し方法を修正する |
エラーが発生したら、まずエラーメッセージの symbol と location を確認し、上記のチェックリストに沿って原因を特定しましょう。IDEの機能(自動インポート、クイックフィックスなど)を活用すれば、多くのケースは素早く解決できます。