Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで「シンボルが見つかりません(cannot find symbol)」エラーが発生する原因と解決方法

Javaでは、外部のクラスやインターフェース(自分で作成したものでも、標準ライブラリに含まれるものでも)を現在のプログラム内で利用する場合、importキーワードを使って対象のクラスをインポートする必要があります。

しかし、インポートの際に以下のような問題があると、コンパイル時に「cannot find symbol(シンボルが見つかりません)」というエラーが発生します。

  • インポートしようとしているクラス/インターフェースのパスがJVMから参照できない
  • import文で指定した完全修飾クラス名(パッケージ名+クラス名)が正確でない
  • 使用しているクラス/インターフェースのインポート自体を行っていない

エラーが発生するコード例

次の例では、キーボード(System.in)からユーザーの名前を表す文字列を読み込もうとしています。このために java.util パッケージの Scanner クラスを使用しています。

public class ReadingData {
    public static void main(String args[]) {
        System.out.println("Enter your name: ");
        Scanner sc = new Scanner(System.in);
        String name = sc.next();
        System.out.println("Hello " + name);
    }
}

コンパイル時エラー

このプログラムでは Scanner クラスを使用しているにもかかわらず、インポート文を記述していません。そのため、コンパイルすると以下のようなエラーが出力されます。

ReadingData.java:6: エラー: シンボルを見つけられません
      Scanner sc = new Scanner(System.in);
      ^
  シンボル:   クラス Scanner
  場所: クラス ReadingData
エラー1個

エラーメッセージには「どのシンボルが見つからなかったか」「どのクラス内で発生したか」が示されるため、原因箇所を特定する手がかりになります。

その他の主な原因

「シンボルが見つかりません」エラーは、import関連以外にも以下のようなケースで発生します。

  • 変数名・メソッド名・クラス名のスペルミス(大文字・小文字の違いも含む)
  • 変数やメソッドを使用前に宣言していない
  • 参照先の変数がスコープ(有効範囲)の外にある

解決方法

  • 必要なクラスが格納されたJARファイルに対して、クラスパスを適切に設定する
  • importキーワードを使って、必要なクラスをパッケージからインポートする。その際、パッケージやサブパッケージを含む完全修飾名で指定する必要がある

修正後のコード例

冒頭で java.util.Scanner をインポートすることで、エラーは解消されます。

import java.util.Scanner;

public class ReadingData {
    public static void main(String args[]) {
        System.out.println("Enter your name: ");
        Scanner sc = new Scanner(System.in);
        String name = sc.next();
        System.out.println("Hello " + name);
    }
}

実行結果

Enter your name:
krishna
Hello krishna

このように、「シンボルが見つかりません」エラーの多くは、クラスのインポート漏れや名前の指定ミスが原因です。エラーメッセージの内容をよく確認し、使用しているクラスが正しくインポートされているか、スペルに誤りがないかを順番にチェックすることが解決への近道です。

  1. JavaでJTextFieldにパディングを追加する方法【setMarginの使い方】

    JTextFieldはJTextComponentクラスのサブクラスであり、ユーザーが1行形式でテキストを入力できる、Swingの中でも特に重要なコンポーネントの一つです。JTextFieldでは、ユーザーが入力を行う際にActionListenerインターフェースを通じてアクションイベントが発生します。主なメソッドとしては、setText()、getText()、setBorder()、setEnabled()などが挙げられます。 JTextFieldにパディング(内側の余白)を追加したい場合は、JTextComponentクラスが提供するsetMargin(Insets m)メソッドを使用

  2. JavaにおけるCursorクラスの役割とは?マウスカーソル制御の基本を解説

    JavaのCursorクラスとはCursorクラスは、Objectクラスのサブクラスであり、画面上のポイント(指し示す位置)やインジケーター(表示標識)として定義されます。ユーザーがマウスを使ってシステムへの入力を選択・操作する際に、その位置を視覚的に示す重要な役割を担っています。GUIアプリケーションでは、状況に応じてカーソルの形状を変えることで、ユーザーに対して直感的なフィードバックを提供できます。例えば、処理中であることを伝える砂時計型のカーソルや、クリック可能な要素を示す手型のカーソルなどが代表的な例です。利用可能なカーソルの種類Cursorクラスには、あらかじめ定義されたさまざまなカ