検索

ホームページ  >  に質問  >  本文

「シンボルが見つかりません」または「シンボルを解決できません」エラーは何を意味しますか?

「シンボルが見つかりません」、「シンボルを解決できません」、または「シンボルが見つかりません」エラー (Java の場合) について次のことを説明してください:

この質問は、Java の一般的なコンパイル エラーに関する包括的な Q&A を提供することを目的としています。

P粉106711425P粉106711425413日前1283

全員に返信(2)返信します

  • P粉203792468

    P粉2037924682023-10-10 12:40:19

    new を忘れた場合は、次のエラーも表示されます:

    リーリー

    比較

    リーリー

    new キーワードのない呼び出しは、引数をとらない String という名前の (ネイティブ) メソッドを検索しようとするため、そのメソッド シグネチャは未定義である可能性があります。

    返事
    0
  • P粉946437474

    P粉9464374742023-10-10 11:07:06

    ###0。これらのエラーに違いはありますか?

    ###本当じゃない。 「シンボルが見つかりません」、「シンボルを解決できません」、「シンボルが見つかりません」はすべて同じ意味です。 (異なる Java コンパイラは異なる人によって作成され、異なる人は同じことを異なる表現で表現します。)

    ###1。 「シンボルが見つかりません」エラーは何を意味しますか?

    まず第一に、これは

    コンパイル エラーです

    1。これは、 Java ソース コードに問題があるか、 または コンパイル方法に問題があることを意味します。 Java ソース コードには次のものが含まれます:

    キーワード: 例:

    class
    • while など。 テキスト: true
    • false42'X'「こんにちは、ママ!」# ##。 演算子およびその他の英数字以外のトークン:
    • =
    • { など。 識別子: 例: Reader
    • i
    • toStringprocessEquibalanceElephants など。 コメントとスペース。
    • 「シンボルが見つかりません」エラーは識別子に関連しています。コードをコンパイルするとき、コンパイラはコード内の各識別子の意味を理解する必要があります。
    • 「シンボルが見つかりません」エラーは、コンパイラーがこの操作を実行できないことを意味します。コードはコンパイラが理解できないものを参照しているようです。
    ###2。 「シンボルが見つかりません」エラーの原因は何ですか?

    最初の注文として、理由は 1 つだけです。コンパイラは識別子を定義すべき場所をあらゆる場所で探しましたが、定義が見つかりませんでした。これはさまざまな理由で発生する可能性があります。一般的なものには次のようなものがあります:

    一般的な識別子の場合:

      おそらく名前のスペルが間違っています。つまり、
    • StringBuilder

      ではなく

      StringBiulder
        です。 Java はスペルミスやタイプミスを補正することはできませんし、補正しようともしません。
      • おそらく間違いです。つまり、StringBuilder ではなく stringBuilder
      • です。すべての Java 識別子では大文字と小文字が区別されます。
      • おそらくアンダースコアの使用方法が間違っている可能性があります。つまり、mystringmy_string
      • が異なります。 (Java スタイルのルールに従えば、この間違いはほとんど回避できます...)
      • おそらく、「他の場所」で宣言されたもの、つまりコンパイラーに参照するように暗黙的に指示したコンテキストとは異なるコンテキストで何かを使用しようとしている可能性があります。 (異なるクラス?異なるスコープ?異なるパッケージ?異なるコードベース?)
      • 変数を参照する必要がある識別子の場合:
    • 変数を宣言するのを忘れた可能性があります。
    • 変数宣言を使用しようとしたときに、その変数宣言がスコープ外になった可能性があります。 (以下の例を参照)

      • メソッド名またはフィールド名である必要がある識別子の場合:
    • おそらく、親/祖先クラスまたはインターフェイスで宣言されていない継承されたメソッドまたはフィールドを参照しようとしています。

      • おそらく、使用している型に存在しない (つまり、宣言されていない) メソッドまたはフィールドを参照しようとしています (例:

        "rope".push()

        #) ##2
      • おそらく、メソッドをフィールドとして使用しようとしている、またはその逆の場合があります (例: "rope".length または

        someArray.length()
      • )。
      • おそらく、配列要素ではなく配列を誤って操作した可能性があります。たとえば、 リーリー

      • クラス名である必要がある識別子の場合:

    • クラスをインポートするのを忘れた可能性があります。
      • 「アスタリスク」インポートを使用した可能性がありますが、インポートしたどのパッケージにもクラスが定義されていませんでした。
      • 次のような
      • new

        を忘れているかもしれません:

        リーリー
      • おそらく、デフォルトのパッケージで既に宣言されているクラス (つまり、package ステートメントのないクラスが存在する場所) をインポートまたは使用しようとしている可能性があります。

        ヒント: パッケージについて理解してください。デフォルト パッケージは、1 つのクラス、または少なくとも 1 つの Java ソース ファイルで構成される単純なアプリケーションにのみ使用してください。

    • 型またはインスタンスに、必要なメンバー (メソッドやフィールドなど) が存在しない場合:

      • おそらく、ネストされたクラスまたはジェネリック パラメーターを宣言し、 使用する型を非表示にしている可能性があります。
      • 静的変数またはインスタンス変数を隠している可能性があります。
      • おそらく、間違ったタイプをインポートした可能性があります。たとえば、IDE の補完または自動修正によって、
      • java.util.List ではなく java.awt.List が提案される可能性があります。
      • おそらく、間違ったバージョンの API を使用 (コンパイル) している可能性があります。
      • オブジェクトを適切なサブクラスにキャストするのを忘れた可能性があります。
      • おそらく、変数
      • の型を、探しているメンバーのスーパータイプとして宣言したと考えられます。
    • 質問は通常、上記の組み合わせです。たとえば、
    java.io.*

    を「スター」としてインポートし、代わりに java.nio にある Files クラスを使用しようとしたとします。 java.io の。あるいは、java.io のクラスである File ... を作成する予定があるかもしれません。

    次の例は、変数のスコープが正しくないと「シンボルが見つかりません」エラーがどのように発生するかを示しています。 リーリー
    これにより、

    if

    ステートメントの

    i に対して「シンボルが見つかりません」エラーが発生します。先ほど i を宣言しましたが、その宣言は for ステートメントとその本体 scope のみです。 if ステートメント 内の i への参照では、 i の宣言を参照できません。 範囲外です (ここでの適切な修正は、if

    ステートメントをループ内に移動するか、ループの開始前に

    i を宣言することです。) これは、タイプミスにより、一見不可解な「シンボルが見つかりません」エラーが発生する、紛らわしい例です:

    リーリー
    これにより、

    println

    呼び出しで

    i が見つからないというコンパイル エラーが発生します。でも(そう言うのが聞こえますが)発表しましたよ! 問題は、{

    の前のセミコロン (

    ; ) です。 Java 言語構文では、このコンテキストでのセミコロンを 空のステートメント として定義します。空のステートメントは、for ループの本体になります。したがって、このコードは実際には次のことを意味します: リーリー { ... }

    ブロックは

    for ループの本体ではないため、i code>for ステートメント内の前の宣言 ブロック内の が範囲外です。 これは、タイプミスによって発生する「シンボルが見つかりません」エラーの別の例です。

    リーリー
    前の宣言にもかかわらず、

    tmp(...)

    式の

    tmp は正しくありません。コンパイラは tmp という名前のメソッドを探しますが、見つかりません。前に宣言した tmp は、メソッドの名前空間ではなく、変数の名前空間にあります。 私が遭遇した例では、プログラマーは実際に演算子を省略しました。彼が最初に書きたかったのは次のとおりです: リーリー


    コマンド ラインからコンパイルする場合、コンパイラーがシンボルを見つけられない理由はもう 1 つあります。他のクラスのコンパイルまたは再コンパイルを単に忘れている可能性があります。たとえば、クラス FooBar があり、FooBar を使用します。 Bar をコンパイルしたことがなく、javac Foo.java を実行すると、コンパイラがシンボル Bar を見つけられないことが簡単にわかります。簡単な答えは、FooBar を一緒にコンパイルすることです (例: javac Foo.java Bar.java または javac *.java)。あるいは、Ant、Maven、Gradle などの Java ビルド ツールを使用することをお勧めします。

    他にももっとあいまいな理由がいくつかあります...それについては後で説明します。

    ###3。これらのエラーを修正するにはどうすればよいですか?

    一般的には、まず

    コンパイル エラーの原因を突き止める必要があります。

    コンパイル エラー メッセージで示されたファイル内の行を確認してください。
    • エラー メッセージがどのシンボルについて話しているのかを確認します。
    • コンパイラがシンボルが見つからないと言っている理由
    • を調べてください。上記を参照してください。
    • 次に、
    • コードで何を表現すべきかを
    考えます。最後に、目的を達成するためにソース コードにどのような修正を加える必要があるかを決定します。

    すべての「修正」が正しいわけではないことに注意してください。考えてみてください: リーリー

    コンパイラが

    j

    に対して「シンボルが見つかりません」というプロンプトを表示するとします。これを「修正」できる方法はたくさんあります:

    内部の

    for
    • for (int j = 1; j < 10; j ) に変更できます。これは正しいかもしれません。 for < 10; j++)j
    • ステートメントを
    • for ループの内側または for ループの外側の の前に追加できます。これは正しいかもしれません。 内部の for ループ内で
    • j
    • i に変更できますが、おそらく間違っています。 ###等。 重要なのは、正しい修正を見つけるには
    • コードが何をしようとしているのかを
    • 理解する必要があるということです。
    • ###4。不明な理由

    次のいくつかのケースでは、「シンボルが見つかりません」というメッセージが、よく見るまでは不可解に見えるかもしれません。

    間違った依存関係

    : ビルド パスとプロジェクトの依存関係を管理する IDE またはビルド ツールを使用している場合は、依存関係の省略など、依存関係で間違いを犯した可能性があります。間違ったバージョンが選択されました。ビルド ツール (Ant、Maven、Gradle など) を使用する場合は、プロジェクトのビルド ファイルを確認してください。 IDE を使用している場合は、プロジェクトのビルド パス構成を確認してください。

    1. シンボル 'var' が見つかりません : ローカル変数の型推論 (つまり、

      var
    2. 宣言) コンパイラーを使用するソース コードをコンパイルするために、古いバージョンを使用しようとしている可能性があります。以前の
    3. --source

      レベル。 var は Java 10 で導入されました。 JDK のバージョンとビルド ファイル、および (これが IDE で発生する場合は) IDE 設定を確認してください。 コンパイル/再コンパイルを行っていません: 新しい Java プログラマーは、Java ツールチェーンがどのように機能するかを理解していないか、反復可能な「ビルド プロセス」を実装していないことがあります (例: IDE の使用)。 、Ant、Maven、Gradle など。この場合、プログラマは、コードを正しく再コンパイルしなかったなどの理由で実際に発生した架空のエラーを追跡することになる可能性があります。

      別の例は、(Java 9) java SomeClass.java を使用してクラスをコンパイルして実行する場合です。クラスがコンパイル (または再コンパイル) していない別のクラスに依存している場合、2 番目のクラスに関連する「シンボルを解決できません」エラーが発生する可能性があります。他のソース ファイルは自動的にコンパイルされません。 java コマンドの新しい「コンパイルして実行」モードは、複数のソース コード ファイルを含むプログラムの実行には適していません。

    4. 初期のビルドの問題: 初期のビルドが失敗し、JAR ファイルにクラスが欠落する可能性があります。ビルド ツールを使用すると、通常、このような失敗に気づくでしょう。ただし、他の人から JAR ファイルを入手した場合は、その人が正しく構築し、エラーに気づくことに依存します。これが疑われる場合は、tar -tvf を使用して、疑わしい JAR ファイルの内容を一覧表示します。

    5. IDE の問題: IDE が混乱し、IDE のコンパイラが存在するクラスを見つけられない、またはその逆の状況が報告されています。

      • これは、IDE が間違った JDK バージョンで構成されている場合に発生する可能性があります。

      • これは、IDE のキャッシュがファイル システムと同期していない場合に発生する可能性があります。この問題を解決するには、IDE 固有の方法がいくつかあります。

      • これは IDE エラーである可能性があります。たとえば、@Joel Costigliola は、Eclipse が Maven の「テスト」ツリーを正しく処理できないシナリオについて説明しています: この回答を参照してください。 (どうやら、この特定のバグはずっと前に修正されていたようです。)

    6. Android の問題: Android 用にプログラミングするときに、R に関連する「シンボルが見つかりません」エラーが発生した場合は、 R# # に注意してください。 # シンボルは context.xml ファイルによって定義されます。 context.xml ファイルが正しく、正しい場所にあること、および対応する #R クラス ファイルが生成/コンパイルされていることを確認してください。 Java シンボルでは大文字と小文字が区別されるため、対応する XML ID も大文字と小文字が区別されることに注意してください。

      Android 上のその他のシンボル エラーは、依存関係の欠落または不正確、パッケージ名、特定の API バージョンに存在しないメソッドまたはフィールド、スペル/入力エラーなど、前述の理由による可能性があります。

    7. 隠しシステム クラス: 以下に示すように、コンパイラが substring が不明なシンボルであると警告するケースを確認しました。 リーリー プログラマが独自のバージョンの

      String

      を作成し、彼のバージョンのクラスが substring メソッドを定義していなかったことが判明しました。これを行うために、SystemScanner、およびその他のクラスを使用している人を見てきました。

      教訓:

      パブリック ライブラリ クラスと同じ名前で独自のクラスを定義しないでください。 この問題は、完全修飾名を使用することによっても解決できます。たとえば、上記の例では、プログラマ

      と書くことができます: リーリー

    8. 同形異義語:

      ソース ファイルに UTF-8 エンコードを使用する場合、同形異義語が含まれているため、 同じように見えても実際には異なる識別子が作成される可能性があります。言葉。詳細については、このページを参照してください。 これを回避するには、ソース ファイルのエンコードを ASCII または Latin-1 に限定し、Java \uxxxx

      を使用して他の文字をエスケープします。


    1 - 実行時例外またはエラー メッセージで do が表示された場合は、コンパイル エラーのあるコードを実行するように IDE が構成されているか、アプリが次の場所でコードを生成およびコンパイルしています。ランタイム。
    2 - 土木工学の 3 つの基本原則: 水は高いところに流れない、板は向かい合うほど強くなる、ロープを押すことはできません

    返事
    0
  • キャンセル返事