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

Java入門

Java「cannot find symbol」エラー原因7つと対処法【2026年版】

トム

・都内自社開発企業勤務/Javaバックエンドエンジニア
/Java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィール

Javaの error: cannot find symbol(シンボルを見つけられません)エラーが出て困っていませんか?

Javaの error: cannot find symbol(シンボルを見つけられません)エラーは、7つの原因パターンのどれかに必ず当てはまります。本記事では冒頭に「30秒で原因特定できる早見表」を置き、該当セクションに飛んでコピペで直せるコード例を示します。

エラーメッセージの symbol: class / method / variable を見れば、原因の半分はすでに絞れています。最短ルートで解決したい方は、本記事の早見表を上からチェックしてください(2026年版・Java 21 LTS対応)。

  • エラーメッセージから原因を30秒で特定する方法
  • スペルミス・import忘れ・スコープ・自作クラス・外部ライブラリなど7パターンの解決コード
  • 同一パッケージ内・Maven/Gradleで発生する特殊ケースへの対処法

私自身、Java開発のキャリアをスタートさせた当初、このエラーに何度も時間を奪われた経験があります。この記事でパターンを押さえておけば、次から素早く解決できるようになります。

今すぐ解決したい方へ:エラーの原因と対処法まとめ

cannot find symbol エラーの原因は、ほぼ次の表に絞られます。

原因具体例対処法
スペル・大文字小文字の間違いstring と書くべきところを String にしていない正しいスペルに修正する
import 文の不足Scanner を使うのに import java.util.Scanner; を書いていないファイル先頭に import 文を追加する
変数の宣言忘れ・スコープ外での使用for文の中で宣言した変数をループの外で使おうとしている変数の宣言位置を使いたい場所に合わせて調整する
private メンバへの外部アクセス別クラスのprivateなメソッドや変数を外から呼び出そうとしているアクセス修飾子を publicに変更するか、getterを使う
自作クラス・同一パッケージのパッケージ設定ミス別ファイルで定義した自作クラスに package 宣言が設定されていない・食い違っている両ファイルのパッケージ宣言を揃えるか import 文を追加する
外部ライブラリ(JAR / Maven / Gradle)の不足pom.xml や build.gradle にライブラリの依存関係を追加し忘れている依存関係を追加しビルドツールを再実行する
static メンバへの誤ったアクセスstaticメソッドをインスタンス経由で呼び出している・またはその逆クラス名.メソッド() の形に修正する

エラーメッセージに表示されている symbol: class / symbol: method / symbol: variableのどれかを確認すれば、上の表のどの原因かをすぐに特定できます。

詳しい解説とコード例は、この後のセクションで順番に説明します。

Javaで「cannot find symbol(シンボルを見つけられません)」が出るのはなぜ?

cannot find symbolエラーは、Javaコンパイラがソースコードを読み込む途中で、あなたが記述した「名前」を見つけられなかったときに発生します。

コンパイラはプログラムを上から順に読み込みます。知らない単語が出てくると「これは何?」と立ち止まってしまうのです。

この「見つけられない名前」のことをJavaの世界では「シンボル」と呼びます。

本記事のコード例は Java 21 LTS(2026年時点の現行LTS) で動作確認しています。Java 8 / 11 / 17 でも同じ現象で発生するため、どのバージョンでも対処法は共通です。

エラーメッセージの意味を理解しよう

エラーメッセージは、解決のための最大のヒントです。cannot find symbol というメッセージが表示されたら、慌てずにその続きを読みます。

Sample.java:10: error: cannot find symbol
    System.out.printin("Hello, World!");
                  ^
  symbol:   method printin(String)
  location: variable out of type PrintStream

エラーメッセージは、以下のような情報を教えてくれています。

ポイント

  • ファイルと行数: Sample.java:10Sample.java ファイルの10行目でエラー
  • エラー箇所: ^ の記号が、問題となっている printin の真下を指す
  • 見つからないシンボルの種類: symbol: method printin(String)printin という名前のメソッドが見つからない
  • 探した場所: location: variable out of type PrintStreamPrintStream 型の out という変数の中を探したけど見つからない

ファイル名・行番号・symbol種別・locationの4点をエラーメッセージから読み取れば、7つの原因パターンのうちどれに該当するかをほぼ確定できます。

よくある原因(クラス・メソッド・変数が見つからない)

「シンボルを見つけられません」エラーの原因は、クラス・メソッド・変数の3分類に絞れます。以下のいずれかに該当することがほとんどです。

ポイント

  1. クラスが見つからない: StringScanner のような、「クラス」の名前を間違えている、または読み込むのを忘れている
  2. メソッドが見つからない: println のような、「メソッド」の名前や使い方を間違えている
  3. 変数が見つからない: 「変数」の名前を間違えている、または使える範囲外で使おうとしている

クラス・メソッド・変数の3分類を理解するだけで、エラー解決のスピードは格段に上がります。

ケース別エラーの具体的な原因と対処法

flowchart TD A["🚨 エラー発生<br>cannot find symbol"] --> B["エラーメッセージを確認"] B --> C{"シンボルの種類"} C -->|"class"| D["クラス名を確認"] C -->|"method"| E["メソッド名を確認"] C -->|"variable"| F["変数名を確認"] D --> D1{"スペルミス?"} D1 -->|"YES"| D2["修正する"] D1 -->|"NO"| D3{"import文は?"} D3 -->|"なし"| D4["import文を追加"] D3 -->|"あり"| D5["依存関係を確認"] E --> E1{"スペルミス?"} E1 -->|"YES"| E2["修正する"] E1 -->|"NO"| E3["引数の型・個数を確認"] F --> F1{"スペルミス?"} F1 -->|"YES"| F2["修正する"] F1 -->|"NO"| F3{"宣言済み?"} F3 -->|"NO"| F4["宣言を追加"] F3 -->|"YES"| F5["スコープを確認"] D2 --> G["✅ 解決"] D4 --> G D5 --> G E2 --> G E3 --> G F2 --> G F4 --> G F5 --> G style A fill:#e74c3c,color:#fff style G fill:#27ae60,color:#fff style C fill:#3498db,color:#fff

ここからは、「シンボルを見つけられません」エラーが発生する具体的な状況と、その対処法をコード例を交えて解説していきます。

クラスが見つからない(symbol: class)場合の解決方法

クラスが見つからない場合、主に「スペルミス」と「import文の不足」が原因です。

原因1:クラス名のスペルミス

Javaでは、大文字と小文字が厳密に区別されます。例えば、文字列を扱う String クラスを string と小文字で書いてしまうと、コンパイラは string という名前のクラスを見つけられずにエラーを出します。

悪い例:

public class Main {
    public static void main(String[] args) {
        string message = "こんにちは"; // ← "String" の "S" が小文字になっている
        System.out.println(message);
    }
}

エラーメッセージ:

Main.java:3: error: cannot find symbol
        string message = "こんにちは";
        ^
  symbol:   class string
  location: class Main

良い例:

クラス名を正しい表記に修正します。stringString に直せば、正しくコンパイルが通ります。

public class Main {
    public static void main(String[] args) {
        String message = "こんにちは"; // ← 正しく大文字の "S" に修正
        System.out.println(message);
    }
}

原因2:import文の不足

Javaには、便利な機能があらかじめ「ライブラリ」として用意されています。キーボードからの入力を受け付ける Scanner クラスなどが代表例です。

ライブラリのクラスを使うには、プログラムの冒頭で「このクラスを使います」という宣言(import文)が必要です。

悪い例:

// import文が不足している
public class UserInput {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // ← Scannerクラスを使おうとしている
        System.out.println("名前を入力してください:");
        String name = scanner.nextLine();
        System.out.println("こんにちは、" + name + "さん");
    }
}

エラーメッセージ:

UserInput.java:3: error: cannot find symbol
        Scanner scanner = new Scanner(System.in);
        ^
  symbol:   class Scanner
  location: class UserInput

良い例:

ファイルの先頭(public class の前)に、使用するクラスの import 文を記述します。Scanner クラスの場合は import java.util.Scanner; と書きます。

import java.util.Scanner; // ← import文を追加

public class UserInput {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("名前を入力してください:");
        String name = scanner.nextLine();
        System.out.println("こんにちは、" + name + "さん");
    }
}

同じパッケージに属するクラスを複数使いたい場合は、アスタリスク * を使ってまとめて import することも可能です。

import java.util.*; // java.utilパッケージの全てのクラスをまとめてimport

public class MyClass {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        ArrayList<String> list = new ArrayList<>();
    }
}

EclipseやIntelliJ IDEAなどのIDEを使っている場合は、import忘れを手で直す必要はありません。エラー箇所にカーソルを合わせてショートカットキー(Eclipseなら Ctrl + Shift + O、IntelliJ IDEAなら Alt + Enter(macOSは Option + Enter)、Visual Studio Codeなら Quick Fix Ctrl + .)を押せば、必要な import 文が自動で追加されます。

IntelliJ IDEAなら Settings → Editor → General → Auto Import → Add unambiguous imports on the fly を有効化しておくと、import文の入力自体が不要になり、「シンボルを見つけられません」エラーの発生源を根元から断てます。

メソッドが見つからない(symbol: method)場合の解決方法

メソッドが見つからないエラーは、主に「スペルミス」や「引数の間違い」が原因で発生します。

原因1:メソッド名のスペルミス

最も単純で、そして最もよくある間違いです。例えば、画面に文字を出力する println メソッドの l (エル) を I (アイ) と見間違えたり、スペルを少しだけ間違えたりするケースです。

悪い例:

public class Greeting {
    public static void main(String[] args) {
        System.out.printIn("Hello Java"); // ← "println" を "printIn" とタイポ
    }
}

良い例:

メソッド名を注意深く確認し、正しいスペルに修正します。printInprintln に直しましょう。

public class Greeting {
    public static void main(String[] args) {
        System.out.println("Hello Java"); // ← 正しいメソッド名に修正
    }
}

原因2:引数の型や個数が違う

メソッドを呼び出す際には、決められた型と個数の「引数」を渡す必要があります。このルールが守られていない場合も、コンパイラは適切なメソッドを見つけられずにエラーを返します。

悪い例:

public class SubstringExample {
    public static void main(String[] args) {
        String text = "Java Programming";
        // 2番目の引数(終了位置)が不足している
        String sub = text.substring(); // ← substringメソッドは引数が必要
        System.out.println(sub);
    }
}

良い例:

使用するメソッドの正しい使い方を調べ、必要な引数を正しく渡します。substringメソッドは、切り出す開始位置や終了位置を数字で指定する必要があります。

public class SubstringExample {
    public static void main(String[] args) {
        String text = "Java Programming";
        // 例えば、5文字目から最後までを切り出す
        String sub = text.substring(5); // ← 開始位置の引数を追加
        System.out.println(sub);
    }
}

変数が見つからない(symbol: variable)場合の解決方法

変数のエラーは、「スペルミス」のほかに「宣言前の使用」や「スコープ外での使用」が主な原因です。

原因1:変数の宣言前に使用

プログラムでは、変数を使う前に「こういう名前で、こういう種類のデータを入れる箱を用意します」という「宣言」が必要です。宣言する前にその変数を使おうとすると、コンパイラはその変数が何なのかわからずエラーになります。

悪い例:

public class VariableOrder {
    public static void main(String[] args) {
        System.out.println(count); // ← 変数 "count" を使うのが先になっている
        int count = 100; // ← 変数の宣言が後になっている
    }
}

良い例:

変数の宣言を、その変数を最初に使用する場所よりも前に移動させます。

public class VariableOrder {
    public static void main(String[] args) {
        int count = 100; // ← 先に変数を宣言する
        System.out.println(count); // ← その後に変数を使う
    }
}

原因2:スコープ外での使用

変数が有効な範囲を「スコープ」と呼びます。スコープは、通常、変数が宣言された波括弧 {} の内側です。その範囲の外から変数を呼び出そうとすると、エラーが発生します。

悪い例:

public class ScopeExample {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println("ループ内: " + i);
        }
        // ループの外側から変数 "i" を使おうとしている
        System.out.println("ループの外: " + i); // ← 変数 "i" は for文の中でしか使えない
    }
}

良い例:

その変数を使いたい場所で有効になるように、宣言する位置を調整します。今回のケースでは、for文の外側で変数 i を使いたいのであれば、for文の外で宣言する必要があります。

public class ScopeExample {
    public static void main(String[] args) {
        int i = 0; // ← ループの外側で変数を宣言
        for (i = 0; i < 5; i++) {
            System.out.println("ループ内: " + i);
        }
        // ループが終わった時点の "i" の値(5)が表示される
        System.out.println("ループの外: " + i);
    }
}
あわせて読む

privateメンバにアクセスしている場合の解決方法

原因:アクセス修飾子による制限

Javaでは、クラスのメソッドや変数に「アクセス修飾子」を付けることで、外部からのアクセスを制御できます。

privateが付いたメソッドや変数は、そのクラスの内側からしか使えません。別のクラスから呼び出そうとすると、コンパイラは「そんなメソッド(変数)は存在しない」と判断してエラーを返します。

悪い例:

public class MyClass {
    private String message = "こんにちは"; // ← privateで宣言されている
}

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        System.out.println(obj.message); // ← 別クラスからprivateの変数にアクセス
    }
}

エラーメッセージ:

Main.java:4: error: cannot find symbol
System.out.println(obj.message);
^
symbol: variable message
location: variable obj of type MyClass

良い例:

privatepublic に変更するか、値を返す専用のメソッド(getter)を用意することで解決します。一般的には、変数は private のまま、getter で値を取り出す方法が推奨されています。

public class MyClass {
    private String message = "こんにちは";
    // 外部からmessageを取得するためのgetterメソッド
    public String getMessage() {
        return message;
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass();
        System.out.println(obj.getMessage()); // ← getterを通じてアクセス
    }
}

自作クラスが見つからない場合の解決方法(同一パッケージ)

複数ファイルに分けてプログラムを書いているとき、自作クラスが見つからないエラーが発生することがあります。原因は、ファイル間の package 宣言が食い違っているケースがほとんどです。

悪い例:

// Animal.java
package jp.example; // ← パッケージ宣言あり
public class Animal {
    public void speak() { System.out.println("鳴く"); }
}

// Main.java
// package宣言なし(デフォルトパッケージ)
public class Main {
    public static void main(String[] args) {
        Animal a = new Animal(); // ← error: cannot find symbol
    }
}

良い例:

両方のファイルで package 宣言を揃えるか、import 文で明示的に読み込みます。

// Main.java
package jp.example; // ← Animalと同じパッケージを宣言

public class Main {
    public static void main(String[] args) {
        Animal a = new Animal(); // ← 同一パッケージなので import 不要
        a.speak();
    }
}

コマンドラインでコンパイルするときは、パッケージのルートディレクトリから javac jp/example/*.java のように実行するのがポイントです。

外部ライブラリ(Maven / Gradle)でシンボルが見つからない場合

MavenやGradleを使ったプロジェクトで、外部ライブラリのクラスに対して cannot find symbol が出るときは、依存関係の追加漏れが原因です。

Mavenの場合(pom.xml):

<!-- pom.xml に dependency を追加 -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.11.0</version>
</dependency>

Gradleの場合(build.gradle):

// build.gradle に dependencies を追加
dependencies {
    implementation 'com.google.code.gson:gson:2.11.0'
}

追加後は必ずビルドツールを再実行(Maven: mvn install、Gradle: ./gradlew build)してください。IDEを使っている場合は、「プロジェクトの更新 / Reload Project」で依存関係を再読み込みする必要があります。

staticメンバへのアクセス方法が間違っている場合

static なメソッドや変数にアクセスする際に、呼び出し方を間違えるとこのエラーが発生します。

悪い例:

public class MathHelper {
    public static int square(int n) { return n * n; }
}

public class Main {
    public static void main(String[] args) {
        MathHelper helper = new MathHelper();
        // staticメソッドをインスタンス経由で呼んでいる(警告またはエラーの原因)
        int result = helper.square(5);

        // 逆に、インスタンスメソッドをクラス名で呼ぼうとする
        // String.length(); ← error: cannot find symbol(引数なし・インスタンス不明)
    }
}

良い例:

static メソッドは クラス名.メソッド名() の形で呼び出します。インスタンスを作る必要はありません。

public class Main {
    public static void main(String[] args) {
        int result = MathHelper.square(5); // ← クラス名で直接呼び出す
        System.out.println(result); // 25
    }
}

原因番外:new キーワードを書き忘れている場合

クラスのインスタンスを作るときに new を書き忘れると、コンパイラは「そのクラス名のメソッドを呼び出そうとした」と解釈し cannot find symbol を返します。

悪い例:

public class Main {
    public static void main(String[] args) {
        MyClass obj = MyClass(); // ← new を書き忘れている
    }
}

良い例:

public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass(); // ← new を付ける
    }
}

IDEを使っていれば入力した瞬間に赤線で検知されます。テキストエディタで書いている場合は、このパターンをつい見落としがちなので注意しましょう。

エラーを再発させないためのチェックリスト

エラーを解決する力も重要ですが、そもそもエラーを発生させないようにコーディングする習慣を身につけることが、上達への一番の近道です。ここでは、エラーを未然に防ぐための3つのチェックポイントを紹介します。

スペル・大文字小文字を確認する

今回紹介したエラー原因の多くは、単純なスペルミスでした。Javaは大文字と小文字を厳密に区別する言語であることを常に意識しましょう。

ポイント

  • Stringstring は別物
  • Systemsystem は別物
  • mainMain は別物

コードを書くときは、一文字一文字を丁寧に確認する癖をつけるのがおすすめです。

パスやクラスパスを正しく設定する

これは、コマンドプロンプトやターミナルなど、黒い画面で直接コマンドを打ち込んでコンパイルや実行を行う場合に特に重要です。

javac コマンドでコンパイルする際に、java.lang.NoClassDefFoundError のようなエラーが出る場合は、クラスパスの設定が間違っている可能性があります。クラスパスとは、Javaがコンパイルされた .class ファイルを探しに行く場所のリストです。

基本的には、コンパイルしたい .java ファイルがあるディレクトリで、以下のように実行すれば問題ありません。

// カレントディレクトリ(今いる場所)をクラスパスに指定してコンパイル
javac -cp . MyProgram.java

// カレントディレクトリをクラスパスに指定して実行
java -cp . MyProgram

-cp . は「カレントディレクトリをクラスパスに含める」という意味で、多くの場合この指定で解決します。

あわせて読む

IDEの補完機能を活用する

開発現場では、EclipseやIntelliJ IDEA、Visual Studio Codeといった統合開発環境(IDE)を使うのが一般的です。これらのツールは、単なるテキストエディタではありません。

ポイント

  • コード補完機能: Sy と打っただけで System の候補を出してくれる
  • エラーのリアルタイム検知: コードを書いているそばから、間違っている箇所に赤線などを引いて教えてくれる
  • 自動インポート: import文を自動で追加してくれる

IDEの補完・検知・自動インポート機能を活用すれば、「シンボルを見つけられません」のような初歩的なエラーの多くは発生した瞬間に気づいて修正でき、学習効率が劇的に向上します。まだテキストエディタだけでプログラミングをしているなら、IDEの導入を検討してみてください。

cannot find symbolエラーに関するよくある質問

Q1. コンパイルは通るのに実行時に cannot find symbol が出るのはなぜ?

コンパイルが成功している時点で cannot find symbol はコンパイルエラーなので発生しません。実行時に似たメッセージが出る場合は java.lang.NoClassDefFoundErrorClassNotFoundException の可能性が高いです。クラスパス(-cp)の設定不足や、JARファイルの配置漏れを確認してください。

Q2. IDE上では赤線が出ないのにビルドで cannot find symbol が出る

Maven / Gradle の依存キャッシュが破損している可能性があります。以下のコマンドでクリーン&再ビルドしてください。

# Maven
mvn clean install

# Gradle
./gradlew clean build --refresh-dependencies

それでも解消しない場合は、IDEの「プロジェクト再読み込み / Invalidate Caches」を試してください。

Q3. var を使ったら cannot find symbol が出る

var キーワードは Java 10 以降で使えます。Java 8 / 9 で書いたり、IDEの language level が 9 以下に設定されていると cannot find symbol になります。pom.xml / build.gradle のコンパイラバージョンと、IDEのプロジェクト設定を Java 11 以上に揃えてください。

まとめ:「シンボルを見つけられません」エラーの7つの原因チェックリスト

このエラーは、コンパイラが指定された名前(シンボル)を見つけられないときに発生します。エラーに遭遇したら、まずは慌てずにエラーメッセージをよく読み、どのファイルの何行目で、どのシンボルが見つからないのかを特定しましょう。

原因は以下の7つのパターンに絞られます。エラーが解決しないときはこのリストを上から順にチェックしてみてください。

  1. スペルミスや大文字・小文字の間違い
  2. import文の不足
  3. 変数の宣言忘れやスコープ外での使用
  4. privateメンバへの外部からのアクセス
  5. 自作クラス・同一パッケージでの package 宣言の食い違い
  6. 外部ライブラリ(JAR / Maven / Gradle)の依存関係が追加されていない
  7. staticメンバへのアクセス方法の誤り(クラス名.メソッド() で呼ぶ)

エラーメッセージに表示される symbol: class / symbol: method / symbol: variable を確認しながら、上のリストを一つずつ当たれば必ず解決の糸口が見つかります。

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

トム

・都内自社開発企業勤務/Javaバックエンドエンジニア
/Java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィール

-Java入門