Javaプログラミングを学習中、コードを書いてコンパイルしようとした時、こんなエラーメッセージが表示されたことはありませんか?
「エラー: シンボルを見つけられません」
「cannot find symbol」
「シンボル: クラス ○○」
「シンボル: 変数 ○○」
「シンボル: メソッド ○○」
このエラーは、Javaプログラミングの初心者が必ずと言っていいほど遭遇する、最も一般的なコンパイルエラーの一つです。
この記事では、「シンボルを見つけられません」というエラーの意味、発生する原因、そして具体的な解決方法を、初心者の方にも分かりやすく解説します。
「シンボルを見つけられません」エラーとは?

このエラーは、Javaのコンパイラが、コード内で使われている名前(シンボル)を見つけられないことを意味します。
シンボルって何?
プログラミングにおける「シンボル」とは、プログラム内で使用される識別子のことです。
具体的には:
- 変数名:
int countのcount - メソッド名:
System.out.println()のprintln - クラス名:
String、ArrayListなど - パッケージ名:
java.utilなど
シンボルテーブルとは?
Javaコンパイラは、コードをコンパイルする際にシンボルテーブルという一覧表を作成します。
シンボルテーブルには以下が記録されます:
- 変数の名前と型
- メソッドの名前と引数
- クラスの名前と場所
- インターフェース情報
コンパイラがコード内でシンボルを見つけると、シンボルテーブルを参照して「このシンボルは何を指しているのか?」を確認します。
エラーが出る理由:
シンボルテーブルに該当するシンボルが登録されていない、またはコンパイラがそのシンボルを見つけられない場合、「シンボルを見つけられません」というエラーが発生します。
エラーメッセージの読み方
エラーメッセージには、問題を解決するためのヒントが含まれています。
基本的なエラーメッセージの構造
Main.java:10: エラー: シンボルを見つけられません
System.out.println(myVariable);
^
シンボル: 変数 myVariable
場所: クラス Main
メッセージの意味:
- ファイル名と行番号:
Main.java:10– Main.javaファイルの10行目 - エラーの内容: 「シンボルを見つけられません」
- 問題の箇所:
^マークが問題のシンボルを指す - シンボルの種類: 「変数 myVariable」- 変数が見つからない
- 場所: 「クラス Main」- Mainクラス内での問題
英語版のエラーメッセージ
Main.java:10: error: cannot find symbol
System.out.println(myVariable);
^
symbol: variable myVariable
location: class Main
エラーが発生する主な原因
このエラーが発生する理由は様々ですが、大きく分けて以下のパターンがあります。
1. スペルミス・タイプミス
最も多い原因です。変数名、メソッド名、クラス名を間違えて入力しています。
例:
String myName = "太郎";
System.out.println(myNmae); // エラー! myNmaeではなくmyName
2. 大文字・小文字の間違い
Javaは大文字と小文字を区別する言語です。Stringとstringは別物として扱われます。
例:
String message = "Hello";
System.out.println(Message); // エラー! Messageではなくmessage
3. 変数の未宣言
変数を宣言する前に使用しようとしています。
例:
public class Main {
public static void main(String[] args) {
sum = 10 + 20; // エラー! sumが宣言されていない
System.out.println(sum);
}
}
4. importの不足
他のパッケージのクラスを使う時、import文を書き忘れています。
例:
public class Main {
public static void main(String[] args) {
// import java.util.Scanner; が必要!
Scanner sc = new Scanner(System.in); // エラー!
}
}
5. スコープ外での変数使用
変数はそれが宣言された場所(スコープ)でしか使えません。
例:
public class Main {
public static void main(String[] args) {
if (true) {
int number = 10; // このブロック内でのみ有効
}
System.out.println(number); // エラー! スコープ外
}
}
6. メソッド名の間違い
メソッド名のスペルミスや、引数の数・型が合っていません。
例:
public class Main {
public static void add(int a, int b) {
System.out.println(a + b);
}
public static void main(String[] args) {
ad(5, 10); // エラー! addではなくad
}
}
7. クラスパスの問題
外部ライブラリやJARファイルのパスが正しく設定されていません。
8. パッケージ構造の不一致
パッケージ宣言とディレクトリ構造が一致していません。
9. newキーワードの不足
インスタンスを作成する時、newキーワードを忘れています。
例:
ArrayList<String> list = ArrayList<String>(); // エラー!
// 正しくは: new ArrayList<String>()
10. アクセス修飾子の問題
privateメンバに外部からアクセスしようとしています。
【基本】エラーの見つけ方と対処法
エラーが出たら、以下の手順で確認していきましょう。
ステップ1: エラーメッセージをよく読む
確認すること:
- どのファイルの何行目でエラーが出ているか
- どのシンボルが見つからないのか
- シンボルの種類(変数、メソッド、クラス)
ステップ2: 該当行を確認する
エラーメッセージで指定された行を見て、^マークが指している部分を確認します。
ステップ3: スペルと大文字小文字をチェック
確認ポイント:
- スペルは正しいか?
- 大文字・小文字は合っているか?
- 全角スペースが混入していないか?
ステップ4: 宣言を確認
変数の場合:
- その変数は宣言されているか?
- 使用している場所より前で宣言されているか?
メソッドの場合:
- そのメソッドは定義されているか?
- 引数の数と型は合っているか?
クラスの場合:
- クラスはimportされているか?
- クラス名は正しいか?
【詳細】各原因と具体的な解決方法

原因1: 変数の未宣言
エラーが出るコード:
public class Main {
public static void main(String[] args) {
int num1 = 100;
int num2 = 200;
sum = num1 + num2; // エラー!
System.out.println(sum);
}
}
エラーメッセージ:
Main.java:5: エラー: シンボルを見つけられません
sum = num1 + num2;
^
シンボル: 変数 sum
場所: クラス Main
解決方法:
変数を使う前に宣言します。
修正したコード:
public class Main {
public static void main(String[] args) {
int num1 = 100;
int num2 = 200;
int sum = num1 + num2; // 修正: int を追加
System.out.println(sum);
}
}
原因2: スペルミス
エラーが出るコード:
public class Main {
public static void main(String[] args) {
String name = "田中";
System.out.println(nmae); // エラー! nではなくn
}
}
エラーメッセージ:
Main.java:4: エラー: シンボルを見つけられません
System.out.println(nmae);
^
シンボル: 変数 nmae
場所: クラス Main
解決方法:
正しいスペルに修正します。
修正したコード:
public class Main {
public static void main(String[] args) {
String name = "田中";
System.out.println(name); // 修正: nameに変更
}
}
原因3: 大文字・小文字の間違い
エラーが出るコード:
public class Main {
public static void main(String[] args) {
StringBuilder sb = new stringBuilder(); // エラー!
sb.append("Hello");
System.out.println(sb.toString());
}
}
エラーメッセージ:
Main.java:3: エラー: シンボルを見つけられません
StringBuilder sb = new stringBuilder();
^
シンボル: クラス stringBuilder
場所: クラス Main
解決方法:
最初の文字を大文字にします。
修正したコード:
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder(); // 修正: Sを大文字に
sb.append("Hello");
System.out.println(sb.toString());
}
}
原因4: import文の不足
エラーが出るコード:
public class Main {
public static void main(String[] args) {
// Scanner クラスを使うにはimportが必要
Scanner sc = new Scanner(System.in); // エラー!
int number = sc.nextInt();
System.out.println(number);
}
}
エラーメッセージ:
Main.java:3: エラー: シンボルを見つけられません
Scanner sc = new Scanner(System.in);
^
シンボル: クラス Scanner
場所: クラス Main
解決方法:
必要なクラスをimportします。
修正したコード:
import java.util.Scanner; // 追加: import文
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
System.out.println(number);
}
}
よく使うimport文:
import java.util.Scanner; // 入力を受け取る
import java.util.ArrayList; // 動的配列
import java.util.List; // リストインターフェース
import java.util.HashMap; // マップ
import java.util.Random; // 乱数生成
import java.io.*; // ファイル入出力
原因5: スコープ外での変数使用
エラーが出るコード:
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
int result = i * 2;
}
// forループの外でresultを使おうとしている
System.out.println(result); // エラー!
}
}
エラーメッセージ:
Main.java:6: エラー: シンボルを見つけられません
System.out.println(result);
^
シンボル: 変数 result
場所: クラス Main
解決方法:
変数をより広いスコープで宣言します。
修正したコード:
public class Main {
public static void main(String[] args) {
int result = 0; // 修正: forループの外で宣言
for (int i = 0; i < 5; i++) {
result = i * 2;
}
System.out.println(result);
}
}
スコープの基本ルール:
- 変数は宣言された
{}ブロック内でのみ有効 - ブロックの外からは参照できない
- より広い範囲で使いたい場合は、外側で宣言する
原因6: メソッド名の間違い
エラーが出るコード:
public class Main {
public static void add(int num1, int num2) {
System.out.println(num1 + num2);
}
public static void main(String[] args) {
ad(5, 10); // エラー! dが1つ足りない
}
}
エラーメッセージ:
Main.java:7: エラー: シンボルを見つけられません
ad(5, 10);
^
シンボル: メソッド ad(int,int)
場所: クラス Main
解決方法:
正しいメソッド名を使用します。
修正したコード:
public class Main {
public static void add(int num1, int num2) {
System.out.println(num1 + num2);
}
public static void main(String[] args) {
add(5, 10); // 修正: addに変更
}
}
原因7: ArrayListなどのコレクションクラスのimport不足
エラーが出るコード:
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<String>(); // エラー!
list.add("Java");
System.out.println(list);
}
}
エラーメッセージ:
Main.java:3: エラー: シンボルを見つけられません
List<String> list = new ArrayList<String>();
^
シンボル: クラス List
場所: クラス Main
解決方法:
java.utilパッケージからimportします。
修正したコード:
import java.util.List;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Java");
System.out.println(list);
}
}
原因8: 初期化されていない変数の使用
エラーが出るコード:
public class Main {
public static void main(String[] args) {
int number;
System.out.println(number); // エラー!
}
}
エラーメッセージ:
Main.java:4: エラー: 変数numberは初期化されていない可能性があります
System.out.println(number);
^
注意: このケースは厳密には「シンボルを見つけられません」エラーとは異なりますが、似た状況で発生します。
解決方法:
変数に初期値を設定します。
修正したコード:
public class Main {
public static void main(String[] args) {
int number = 0; // 修正: 初期化
System.out.println(number);
}
}
【上級】パッケージとクラスパスの問題
パッケージ構造が正しくない場合
エラーが出る状況:
// ファイル: MyClass.java
// 場所: C:\Users\Projects\MyClass.java
package com.example.myapp; // パッケージ宣言
public class MyClass {
public void display() {
System.out.println("Hello");
}
}
問題点:
パッケージがcom.example.myappと宣言されているのに、ファイルが正しいディレクトリ構造に配置されていません。
正しい配置:
Projects/
└── com/
└── example/
└── myapp/
└── MyClass.java
コンパイル方法:
# Projectsディレクトリから
javac com/example/myapp/MyClass.java
実行方法:
# Projectsディレクトリから
java com.example.myapp.MyClass
外部JARファイルを使う場合
エラーが出る状況:
外部ライブラリ(JARファイル)のクラスを使おうとしているが、クラスパスが設定されていない。
解決方法:
コンパイル時と実行時にクラスパスを指定します。
Windowsの場合:
# コンパイル
javac -cp ".;lib\mylibrary.jar" Main.java
# 実行
java -cp ".;lib\mylibrary.jar" Main
Mac/Linuxの場合:
# コンパイル
javac -cp ".:lib/mylibrary.jar" Main.java
# 実行
java -cp ".:lib/mylibrary.jar" Main
IDE(統合開発環境)を使った解決法

IDE(EclipseやIntelliJ IDEA、Visual Studio Code)を使うと、多くのエラーを自動的に検出・修正できます。
IDEの便利な機能
1. リアルタイムエラー検出
コードを書いている最中に、エラーがある箇所に赤い波線が表示されます。
2. コード補完
クラス名や変数名を途中まで入力すると、候補を表示してくれます。
3. 自動import
未importのクラスを使うと、自動的にimport文を追加する提案が出ます。
4. クイックフィックス
エラーにカーソルを合わせると、修正候補が表示されます。
Eclipse での対処法
エラーが出た時:
- エラーの箇所に赤い波線が表示される
- エラーにマウスを合わせる
- 表示される「クイックフィックス」を選択
- 適切な修正を選ぶ
自動import:
- Ctrl + Shift + O (Windowsの場合)
- Cmd + Shift + O (Macの場合)
IntelliJ IDEAでの対処法
エラーが出た時:
- エラーの箇所に赤い波線が表示される
- Alt + Enter を押す
- 修正候補が表示される
- 適切な修正を選択
自動import:
設定で「Auto Import」を有効にすると、自動的にimport文が追加されます。
Visual Studio Code (VS Code) での対処法
必要な拡張機能:
- Extension Pack for Java
エラーが出た時:
- エラーの箇所に赤い波線が表示される
- 電球マークをクリック
- 修正候補から選択
よくある質問
Q: エラーメッセージに複数の「シンボルを見つけられません」が表示されます。
A: 1つのエラーが原因で、連鎖的に複数のエラーが発生することがあります。まず最初のエラー(一番上に表示されているエラー)を修正してから、再度コンパイルしてみてください。多くの場合、最初のエラーを直すと、他のエラーも自動的に解消されます。
Q: import文を追加したのにまだエラーが出ます。
A: 以下を確認してください:
- import文のスペルは正しいか?
- パッケージ名は正しいか?
- クラスパスは正しく設定されているか?
- 外部ライブラリの場合、JARファイルは存在するか?
Q: 他の人のコードをコピーしたのにエラーが出ます。
A: 以下の可能性があります:
- 必要なimport文がコピーされていない
- コピー元とは異なるJavaバージョンを使っている
- 外部ライブラリが不足している
- パッケージ構造が異なる
Q: Eclipseでは動くのに、コマンドラインでコンパイルするとエラーが出ます。
A: IDEは自動的にクラスパスを設定しますが、コマンドラインでは手動設定が必要です。必要なJARファイルをクラスパスに追加してください。
Q: 「シンボル: 変数」と「シンボル: クラス」の違いは?
A:
- シンボル: 変数 – 変数名が見つからない
- シンボル: クラス – クラス名が見つからない(import不足の可能性)
- シンボル: メソッド – メソッド名が見つからない
どの種類のシンボルかによって、確認すべきポイントが変わります。
Q: コンパイルは成功するのに、実行時にエラーが出ます。
A: それは別の種類のエラー(実行時エラー)です。「シンボルを見つけられません」はコンパイル時エラーなので、コンパイルが成功すれば、このエラーは解決しています。実行時エラーは別の原因です。
Q: 全角スペースが原因になることはありますか?
A: はい、あります。全角スペースが混入すると、コンパイラが正しく認識できず、エラーになることがあります。特に日本語入力をオンにしたままコーディングすると、気づかずに全角スペースが入ることがあるので注意してください。
まとめ:エラーを恐れずに、一つずつ解決しよう
「シンボルを見つけられません」エラーは、Javaプログラミングで最もよく遭遇するエラーですが、原因を理解すれば解決は簡単です。
エラー解決の基本手順:
ステップ1: エラーメッセージを読む(所要時間: 30秒)
- どのファイルの何行目か
- どのシンボルが見つからないか
- シンボルの種類(変数/メソッド/クラス)
ステップ2: 基本的なチェック(所要時間: 2-3分)
- スペルミスはないか?
- 大文字・小文字は正しいか?
- 変数は宣言されているか?
- import文は必要か?
ステップ3: スコープの確認(所要時間: 3-5分)
- 変数は正しいスコープ内で使っているか?
- メソッドの引数は合っているか?
ステップ4: 環境の確認(所要時間: 5-10分)
- クラスパスは正しいか?
- パッケージ構造は正しいか?
- 必要なライブラリはあるか?
重要なポイント:
- エラーメッセージは敵ではなく、問題を教えてくれる味方
- ほとんどのエラーは、スペルミスか未宣言が原因
- IDEを使うと、多くのエラーを未然に防げる
- 最初のエラーから順番に修正する
- 分からない時は、エラーメッセージをそのまま検索する
初心者へのアドバイス:
このエラーは、プログラミングを学ぶ過程で必ず通る道です。エラーが出ても落ち込む必要はありません。むしろ、エラーメッセージの読み方を学ぶ良い機会だと考えましょう。
何度も同じエラーを経験することで、エラーメッセージを見ただけで原因が分かるようになります。焦らず、一つずつ丁寧に確認していけば、必ず解決できます。
プログラミングスキルの向上には、エラーを解決する経験が不可欠です。このエラーを乗り越えることで、あなたのJavaスキルは確実に成長します!

コメント