初期のビルドの問題: 初期のビルドが失敗し、JAR ファイルにクラスが欠落する可能性があります。ビルド ツールを使用すると、通常、このような失敗に気づくでしょう。ただし、他の人から JAR ファイルを入手した場合は、その人が正しく構築し、エラーに気づくことに依存します。これが疑われる場合は、tar -tvf を使用して、疑わしい JAR ファイルの内容を一覧表示します。
IDE の問題: IDE が混乱し、IDE のコンパイラが存在するクラスを見つけられない、またはその逆の状況が報告されています。
リーリーnew
を忘れた場合は、次のエラーも表示されます:比較
リーリーnew
キーワードのない呼び出しは、引数をとらない
Stringという名前の (ネイティブ) メソッドを検索しようとするため、そのメソッド シグネチャは未定義である可能性があります。
###0。これらのエラーに違いはありますか?
###本当じゃない。 「シンボルが見つかりません」、「シンボルを解決できません」、「シンボルが見つかりません」はすべて同じ意味です。 (異なる Java コンパイラは異なる人によって作成され、異なる人は同じことを異なる表現で表現します。)
###1。 「シンボルが見つかりません」エラーは何を意味しますか?コンパイル エラーです
1。これは、 Java ソース コードに問題があるか、 または コンパイル方法に問題があることを意味します。 Java ソース コードには次のものが含まれます:
キーワード: 例:
class、- while
、- false
演算子およびその他の英数字以外のトークン:
、 =- 、
識別子: 例: i- 、
コメントとスペース。
「シンボルが見つかりません」エラーは識別子に関連しています。コードをコンパイルするとき、コンパイラはコード内の各識別子の意味を理解する必要があります。 -
「シンボルが見つかりません」エラーは、コンパイラーがこの操作を実行できないことを意味します。コードはコンパイラが理解できないものを参照しているようです。
###2。 「シンボルが見つかりません」エラーの原因は何ですか?など。
テキスト:
true、
42、
'X'、
「こんにちは、ママ!」# ##。{
など。Reader
、toString
、processEquibalanceElephants
など。おそらく名前のスペルが間違っています。つまり、- StringBuilder
変数を宣言するのを忘れた可能性があります。 -
-
- メソッド名またはフィールド名である必要がある識別子の場合:
- おそらく、親/祖先クラスまたはインターフェイスで宣言されていない継承されたメソッドまたはフィールドを参照しようとしています。
- おそらく、使用している型に存在しない (つまり、宣言されていない) メソッドまたはフィールドを参照しようとしています (例:
。 -
someArray.length() )。 -
-
クラスをインポートするのを忘れた可能性があります。 -
-
- おそらく、ネストされたクラスまたはジェネリック パラメーターを宣言し、 使用する型を非表示にしている可能性があります。
静的変数またはインスタンス変数を隠している可能性があります。 -
おそらく、間違ったタイプをインポートした可能性があります。たとえば、IDE の補完または自動修正によって、- java.util.List
おそらく、間違ったバージョンの API を使用 (コンパイル) している可能性があります。 -
オブジェクトを適切なサブクラスにキャストするのを忘れた可能性があります。 -
おそらく、変数 - の型を、探しているメンバーのスーパータイプとして宣言したと考えられます。
質問は通常、上記の組み合わせです。たとえば、
java.io.*ではなく
StringBiulderです。 Java はスペルミスやタイプミスを補正することはできませんし、補正しようともしません。-
です。すべての Java 識別子では大文字と小文字が区別されます。 -
が異なります。 (Java スタイルのルールに従えば、この間違いはほとんど回避できます...) -
- 変数を参照する必要がある識別子の場合:
おそらく間違いです。つまり、
StringBuilderではなく
stringBuilderおそらくアンダースコアの使用方法が間違っている可能性があります。つまり、
mystringと
my_stringおそらく、「他の場所」で宣言されたもの、つまりコンパイラーに参照するように暗黙的に指示したコンテキストとは異なるコンテキストで何かを使用しようとしている可能性があります。 (異なるクラス?異なるスコープ?異なるパッケージ?異なるコードベース?)
変数宣言を使用しようとしたときに、その変数宣言がスコープ外になった可能性があります。 (以下の例を参照)
"rope".push()
#) ##2おそらく、メソッドをフィールドとして使用しようとしている、またはその逆の場合があります (例: "rope".length または
おそらく、配列要素ではなく配列を誤って操作した可能性があります。たとえば、
リーリー
クラス名である必要がある識別子の場合:
「アスタリスク」インポートを使用した可能性がありますが、インポートしたどのパッケージにもクラスが定義されていませんでした。-
次のような - new
-
を忘れているかもしれません:
リーリーおそらく、デフォルトのパッケージで既に宣言されているクラス (つまり、
package
ステートメントのないクラスが存在する場所) をインポートまたは使用しようとしている可能性があります。ヒント: パッケージについて理解してください。デフォルト パッケージは、1 つのクラス、または少なくとも 1 つの Java ソース ファイルで構成される単純なアプリケーションにのみ使用してください。
型またはインスタンスに、必要なメンバー (メソッドやフィールドなど) が存在しない場合:
ではなく
java.awt.Listが提案される可能性があります。
を「スター」としてインポートし、代わりに
次の例は、変数のスコープが正しくないと「シンボルが見つかりません」エラーがどのように発生するかを示しています。 リーリーjava.nio
にあるFiles
クラスを使用しようとしたとします。java.io代码> の。あるいは、
java.io
のクラスであるFile
... を作成する予定があるかもしれません。これにより、
if
ステートメントのi
i の宣言を参照できません。 範囲外です
ステートメントをループ内に移動するか、ループの開始前にに対して「シンボルが見つかりません」エラーが発生します。先ほど
iを宣言しましたが、その宣言は
forステートメントとその本体
scopeのみです。
if ステートメント 内のi
への参照では、。
(ここでの適切な修正は、ifi
これは、タイプミスにより、一見不可解な「シンボルが見つかりません」エラーが発生する、紛らわしい例です:
リーリーを宣言することです。)
これにより、
println
呼び出しでi
の前のセミコロン (が見つからないというコンパイル エラーが発生します。でも(そう言うのが聞こえますが)発表しましたよ!
問題は、
{;
ブロックは) です。 Java 言語構文では、このコンテキストでのセミコロンを
空のステートメントとして定義します。空のステートメントは、
for ループの本体になります。したがって、このコードは実際には次のことを意味します: リーリー{ ... }
for
リーリーループの本体ではないため、
icode>for
ステートメント内の前の宣言ブロック内の
が範囲外です。 これは、タイプミスによって発生する「シンボルが見つかりません」エラーの別の例です。前の宣言にもかかわらず、
tmp(...)
式のtmp
は正しくありません。コンパイラは
tmpという名前のメソッドを探しますが、見つかりません。前に宣言した
tmpは、メソッドの名前空間ではなく、変数の名前空間にあります。
私が遭遇した例では、プログラマーは実際に演算子を省略しました。彼が最初に書きたかったのは次のとおりです:
リーリーコマンド ラインからコンパイルする場合、コンパイラーがシンボルを見つけられない理由はもう 1 つあります。他のクラスのコンパイルまたは再コンパイルを単に忘れている可能性があります。たとえば、クラス
Foo
とBar
があり、Foo
はBar
を使用します。Bar
をコンパイルしたことがなく、javac Foo.java
を実行すると、コンパイラがシンボルBar
を見つけられないことが簡単にわかります。簡単な答えは、Foo
とBar
を一緒にコンパイルすることです (例:javac Foo.java Bar.java
またはjavac *.java
)。あるいは、Ant、Maven、Gradle などの Java ビルド ツールを使用することをお勧めします。他にももっとあいまいな理由がいくつかあります...それについては後で説明します。
###3。これらのエラーを修正するにはどうすればよいですか?コンパイル エラーの原因を突き止める必要があります。
コンパイル エラー メッセージで示されたファイル内の行を確認してください。すべての「修正」が正しいわけではないことに注意してください。考えてみてください: リーリー
コンパイラがj
に対して「シンボルが見つかりません」というプロンプトを表示するとします。これを「修正」できる方法はたくさんあります:を- for (int j = 1; j に変更できます。これは正しいかもしれません。
ステートメントを - for
j- を
重要なのは、正しい修正を見つけるには コードが何をしようとしているのかを - 理解する必要があるということです。
###4。不明な理由
for j
ループの内側または
forループの外側の
の前に追加できます。これは正しいかもしれません。 内部のfor
ループ内でi
に変更できますが、おそらく間違っています。###等。
次のいくつかのケースでは、「シンボルが見つかりません」というメッセージが、よく見るまでは不可解に見えるかもしれません。
間違った依存関係: ビルド パスとプロジェクトの依存関係を管理する IDE またはビルド ツールを使用している場合は、依存関係の省略など、依存関係で間違いを犯した可能性があります。間違ったバージョンが選択されました。ビルド ツール (Ant、Maven、Gradle など) を使用する場合は、プロジェクトのビルド ファイルを確認してください。 IDE を使用している場合は、プロジェクトのビルド パス構成を確認してください。
シンボル 'var' が見つかりません : ローカル変数の型推論 (つまり、
varレベル。 var は Java 10 で導入されました。 JDK のバージョンとビルド ファイル、および (これが IDE で発生する場合は) IDE 設定を確認してください。
コンパイル/再コンパイルを行っていません
: 新しい Java プログラマーは、Java ツールチェーンがどのように機能するかを理解していないか、反復可能な「ビルド プロセス」を実装していないことがあります (例: IDE の使用)。 、Ant、Maven、Gradle など。この場合、プログラマは、コードを正しく再コンパイルしなかったなどの理由で実際に発生した架空のエラーを追跡することになる可能性があります。別の例は、(Java 9)
java SomeClass.java
を使用してクラスをコンパイルして実行する場合です。クラスがコンパイル (または再コンパイル) していない別のクラスに依存している場合、2 番目のクラスに関連する「シンボルを解決できません」エラーが発生する可能性があります。他のソース ファイルは自動的にコンパイルされません。java
コマンドの新しい「コンパイルして実行」モードは、複数のソース コード ファイルを含むプログラムの実行には適していません。初期のビルドの問題: 初期のビルドが失敗し、JAR ファイルにクラスが欠落する可能性があります。ビルド ツールを使用すると、通常、このような失敗に気づくでしょう。ただし、他の人から JAR ファイルを入手した場合は、その人が正しく構築し、エラーに気づくことに依存します。これが疑われる場合は、
tar -tvf
を使用して、疑わしい JAR ファイルの内容を一覧表示します。IDE の問題: IDE が混乱し、IDE のコンパイラが存在するクラスを見つけられない、またはその逆の状況が報告されています。
これは、IDE が間違った JDK バージョンで構成されている場合に発生する可能性があります。
これは、IDE のキャッシュがファイル システムと同期していない場合に発生する可能性があります。この問題を解決するには、IDE 固有の方法がいくつかあります。
これは IDE エラーである可能性があります。たとえば、@Joel Costigliola は、Eclipse が Maven の「テスト」ツリーを正しく処理できないシナリオについて説明しています: この回答を参照してください。 (どうやら、この特定のバグはずっと前に修正されていたようです。)
Android の問題: Android 用にプログラミングするときに、
Android 上のその他のシンボル エラーは、依存関係の欠落または不正確、パッケージ名、特定の API バージョンに存在しないメソッドまたはフィールド、スペル/入力エラーなど、前述の理由による可能性があります。R
に関連する「シンボルが見つかりません」エラーが発生した場合は、R# # に注意してください。 # シンボルは
context.xmlファイルによって定義されます。
context.xmlファイルが正しく、正しい場所にあること、および対応する
#Rクラス ファイルが生成/コンパイルされていることを確認してください。 Java シンボルでは大文字と小文字が区別されるため、対応する XML ID も大文字と小文字が区別されることに注意してください。
隠しシステム クラス: 以下に示すように、コンパイラが substring
Stringが不明なシンボルであると警告するケースを確認しました。 リーリー
プログラマが独自のバージョンのを作成し、彼のバージョンのクラスが
教訓:substring
メソッドを定義していなかったことが判明しました。これを行うために、System
、Scanner
、およびその他のクラスを使用している人を見てきました。パブリック ライブラリ クラスと同じ名前で独自のクラスを定義しないでください。 この問題は、完全修飾名を使用することによっても解決できます。たとえば、上記の例では、プログラマ
はと書くことができます: リーリー
ソース ファイルに UTF-8 エンコードを使用する場合、同形異義語が含まれているため、 同じように見えても実際には異なる識別子が作成される可能性があります。言葉。詳細については、このページを参照してください。 これを回避するには、ソース ファイルのエンコードを ASCII または Latin-1 に限定し、Java \uxxxx
を使用して他の文字をエスケープします。1 - 実行時例外またはエラー メッセージで do が表示された場合は、コンパイル エラーのあるコードを実行するように IDE が構成されているか、アプリが次の場所でコードを生成およびコンパイルしています。ランタイム。
2 - 土木工学の 3 つの基本原則: 水は高いところに流れない、板は向かい合うほど強くなる、ロープを押すことはできません。