「シンボルが見つかりません」、「シンボルを解決できません」、または「シンボルが見つかりません」エラー (Java の場合) について次のことを説明してください:
この質問は、Java の一般的なコンパイル エラーに関する包括的な Q&A を提供することを目的としています。
P粉2037924682023-10-10 12:40:19
new
を忘れた場合は、次のエラーも表示されます:
比較
リーリーnew キーワードのない呼び出しは、引数をとらない
String という名前の (ネイティブ) メソッドを検索しようとするため、そのメソッド シグネチャは未定義である可能性があります。
P粉9464374742023-10-10 11:07:06
###0。これらのエラーに違いはありますか?
まず第一に、これは
1。これは、 Java ソース コードに問題があるか、 または コンパイル方法に問題があることを意味します。 Java ソース コードには次のものが含まれます:
キーワード: 例:
class など。
テキスト:
true、
42、
'X'、
「こんにちは、ママ!」# ##。
演算子およびその他の英数字以外のトークン:
、{
など。
識別子: 例: Reader
、toString
、processEquibalanceElephants
など。
コメントとスペース。
最初の注文として、理由は 1 つだけです。コンパイラは識別子を定義すべき場所をあらゆる場所で探しましたが、定義が見つかりませんでした。これはさまざまな理由で発生する可能性があります。一般的なものには次のようなものがあります:
一般的な識別子の場合:
ではなく
StringBiulderおそらく間違いです。つまり、
StringBuilder ではなく
stringBuilderおそらくアンダースコアの使用方法が間違っている可能性があります。つまり、
mystring と
my_stringおそらく、「他の場所」で宣言されたもの、つまりコンパイラーに参照するように暗黙的に指示したコンテキストとは異なるコンテキストで何かを使用しようとしている可能性があります。 (異なるクラス?異なるスコープ?異なるパッケージ?異なるコードベース?)
変数宣言を使用しようとしたときに、その変数宣言がスコープ外になった可能性があります。 (以下の例を参照)
"rope".push()
#) ##2
おそらく、メソッドをフィールドとして使用しようとしている、またはその逆の場合があります (例: "rope".length または
おそらく、配列要素ではなく配列を誤って操作した可能性があります。たとえば、
リーリー
クラス名である必要がある識別子の場合:
を忘れているかもしれません:
リーリーおそらく、デフォルトのパッケージで既に宣言されているクラス (つまり、package
ステートメントのないクラスが存在する場所) をインポートまたは使用しようとしている可能性があります。
ヒント: パッケージについて理解してください。デフォルト パッケージは、1 つのクラス、または少なくとも 1 つの Java ソース ファイルで構成される単純なアプリケーションにのみ使用してください。
型またはインスタンスに、必要なメンバー (メソッドやフィールドなど) が存在しない場合:
ではなく
java.awt.List が提案される可能性があります。
を「スター」としてインポートし、代わりに 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 つあります。他のクラスのコンパイルまたは再コンパイルを単に忘れている可能性があります。たとえば、クラス 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 < 10; j++)
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 用にプログラミングするときに、R
に関連する「シンボルが見つかりません」エラーが発生した場合は、 R# # に注意してください。 # シンボルは
context.xml ファイルによって定義されます。
context.xml ファイルが正しく、正しい場所にあること、および対応する
#R クラス ファイルが生成/コンパイルされていることを確認してください。 Java シンボルでは大文字と小文字が区別されるため、対応する XML ID も大文字と小文字が区別されることに注意してください。
隠しシステム クラス: 以下に示すように、コンパイラが substring が不明なシンボルであると警告するケースを確認しました。
リーリー
プログラマが独自のバージョンの
を作成し、彼のバージョンのクラスが substring
メソッドを定義していなかったことが判明しました。これを行うために、System
、Scanner
、およびその他のクラスを使用している人を見てきました。
パブリック ライブラリ クラスと同じ名前で独自のクラスを定義しないでください。 この問題は、完全修飾名を使用することによっても解決できます。たとえば、上記の例では、プログラマ
はと書くことができます: リーリー
ソース ファイルに UTF-8 エンコードを使用する場合、同形異義語が含まれているため、 同じように見えても実際には異なる識別子が作成される可能性があります。言葉。詳細については、このページを参照してください。 これを回避するには、ソース ファイルのエンコードを ASCII または Latin-1 に限定し、Java \uxxxx
を使用して他の文字をエスケープします。1 - 実行時例外またはエラー メッセージで do が表示された場合は、コンパイル エラーのあるコードを実行するように IDE が構成されているか、アプリが次の場所でコードを生成およびコンパイルしています。ランタイム。
2 - 土木工学の 3 つの基本原則: 水は高いところに流れない、板は向かい合うほど強くなる、ロープを押すことはできません。