Sila terangkan perkara berikut tentang ralat "simbol tidak ditemui", "tidak dapat menyelesaikan simbol" atau "simbol tidak ditemui" (dalam Java):
Soalan ini bertujuan untuk menyediakan Soal Jawab yang komprehensif tentang ralat kompilasi biasa di Jawa ini.
Jika anda terlupa
newanda juga akan mendapat ralat ini:Perbandingan
Oleh kerana panggilan tanpa kata kunci
new关键字的调用将尝试查找不带参数的名为Stringakan cuba mencari kaedah (asli) bernamaStringyang tidak mengambil parameter - dan tandatangan kaedah itu mungkin tidak ditentukan. p>0. Adakah terdapat perbezaan antara ralat ini?
Tidak benar. "Simbol tidak ditemui", "Tidak dapat menyelesaikan simbol" dan "Simbol tidak ditemui" semuanya bermaksud perkara yang sama. (Penyusun Java yang berbeza ditulis oleh orang yang berbeza, dan orang yang berbeza menggunakan perkataan yang berbeza untuk mengatakan perkara yang sama.)
1. Apakah maksud ralat "simbol tidak ditemui"?
Pertama sekali, ini adalahralat penyusunan1. Ini bermaknaterdapat masalah dalam kod sumber Java anda,atauterdapat masalah dengan cara anda menyusunnya.
Kod sumber Java anda mengandungi perkara berikut:
- Kata kunci: Contohnya
- Teks: Seperti
- pengendali dan token bukan abjad lain: cth.
Pengecam: Contohnya
- dll.
Komen dan ruang.
Ralat "Simbol tidak ditemui" berkaitan dengan pengecam. Semasa menyusun kod, pengkompil perlu memikirkan maksud setiap pengecam dalam kod. Ralat "Simbol tidak ditemui" bermakna pengkompil tidak dapat melaksanakan operasi ini. Kod anda nampaknya merujuk sesuatu yang tidak difahami oleh pengkompil. 2. Apakah yang menyebabkan ralat "simbol tidak ditemui"? Sebagai tempahan pertama, hanya ada satu sebab. Pengkompil mencari di mana-mana tempat pengecam harus ditakrifkan, tetapi tidak menemui definisi. Ini boleh disebabkan oleh pelbagai sebab. Yang biasa termasuk yang berikut:class、whiledll.true、false、42、'X'和“嗨妈妈!”.+、=、{Reader、i、toString、processEquibalancedElephants- Untuk pengecam umum:
- Mungkin anda cuba merujuk kaedah atau medan yang diwarisi yang tidak diisytiharkan dalam kelas atau antara muka ibu bapa/nenek moyang.
- Mungkin anda cuba merujuk kaedah atau medan yang tidak wujud (iaitu belum diisytiharkan) dalam jenis yang anda gunakan sebagai contoh
- 2
- Mungkin anda telah mengisytiharkan kelas bersarang atau parameter generik,menyembunyikanjenis yang anda ingin gunakan.
- Mungkin anda menyembunyikan pembolehubah statik atau pembolehubah contoh.
- Mungkin anda mengimport jenis yang salah; cth.
Mungkin anda menggunakan (mengkompil) versi API yang salah.
Mungkin anda terlupa untuk menghantar objek ke subkelas yang sesuai.
Mungkin anda telah mengisytiharkan
- jenis pembolehubahsebagai supertype ahli yang anda cari.
Soalan selalunya gabungan di atas. Contohnya, mungkin anda "bintang" mengimport kelas dalamMungkin nama anda dieja dengan betul; Java tidak boleh dan tidak cuba untuk mengimbangi kesilapan ejaan atau kesilapan tipografi.
- Mungkin anda menggunakan garis bawah dengan salah; iaitu
- Mungkin anda cuba menggunakan sesuatu yang diisytiharkan "di tempat lain"; iaitu dalam konteks yang berbeza daripada yang anda secara tersirat memberitahu pengkompil untuk melihat. (Kelas berbeza? Skop berbeza? Pakej berbeza? Pangkalan kod berbeza?)
Untuk pengecam yang harus merujuk pembolehubah:StringBiulder而不是StringBuilderMungkin anda salah faham; Semua pengecam Java adalah sensitif huruf besar-besaran.stringBuilder而不是StringBuilderberbeza. (Jika anda berpegang kepada peraturan gaya Java, anda akan mengelakkan kesilapan ini...)mystring和my_stringMungkin anda terlupa untuk mengisytiharkan pembolehubah.
Mungkin pengisytiharan pembolehubah telah di luar skop apabila anda cuba menggunakannya. (lihat contoh di bawah)
Untuk pengecam yang sepatutnya merupakan kaedah atau nama medan:.
"rope".push()Mungkin anda cuba menggunakan kaedah sebagai medan atau sebaliknya
"rope".length或someArray.length().Mungkin anda tersilap memanipulasi tatasusunan dan bukannya elemen tatasusunan sebagai contoh
String strings[] = ... if (strings.charAt(3)) { ... } // maybe that should be 'strings[0].charAt(3)'Untuk pengecam yang sepatutnya nama kelas:
Mungkin anda terlupa mengimport kelas.
Mungkin anda menggunakan import "asterisk" tetapi kelas tidak ditentukan dalam mana-mana pakej yang anda import.
Mungkin anda terlupa satu
newseperti ini:Mungkin anda cuba mengimport atau sebaliknya menggunakan kelas yang telah diisytiharkan dalam pakej lalai iaitu di mana kelas tanpa pernyataan
packageberada.Petua: Buka bungkusan. Anda hanya perlu menggunakan pakej lalai untuk aplikasi mudah yang terdiri daripada satu kelas...atau sekurang-kurangnya satu fail sumber Java.
Untuk kes di mana jenis atau kejadian nampaknya tidak mempunyai ahli (seperti kaedah atau medan) yang anda harapkan ada:
java.awt.List而不是java.util.List.
java.io.*,然后尝试使用Files类...它位于java.nio代码>而不是java.io。或者,也许您打算编写File...,它是java.ioContoh berikut menggambarkan cara skop pembolehubah yang salah boleh membawa kepada ralat "simbol tidak ditemui":
List
strings = ... for (int i = 0; i Ini akan memberikan ralat "simbol tidak ditemui" untuk
untuk pernyataan dan isinya
- Lihat baris dalam fail yang ditunjukkan oleh mesej ralat kompilasi.
- Tentukan simbol yang dimaksudkan oleh mesej ralat.
- Ketahuimengapapengkompil mengatakan simbol tidak dapat ditemui;
idalam pernyataanif. Walaupun kami mengisytiharkanilebih awal, pengisytiharan itu hanyalahskop
di luar skopif语句中为i提供“找不到符号”错误。尽管我们之前声明了i,但该声明仅for语句及其主体范围。if语句中对i的引用看不到i. Rujukan kepadaidalam pernyataaniftidak dapat melihatpengisytiharani. Ia.
(Pembetulan yang sesuai di sini mungkin untukif语句移至循环内部,或在循环开始之前声明i.)
Berikut ialah contoh mengelirukan apabila kesilapan menaip menyebabkan ralat "simbol tidak ditemui" yang kelihatan tidak dapat dijelaskan:
println调用中给您一个编译错误,指出无法找到iKemudian andaberfikirtentang perkara yang sepatutnya dinyatakan oleh kod anda. Akhir sekali, anda menentukan pembetulan yang perlu dibuat pada kod sumber untuk mencapai apa yang anda mahukan.
Sila ambil perhatian bahawa tidak setiap "pembetulan" adalah betul. Pertimbangkan ini:
- Saya boleh meletakkan dalaman
- Saya boleh menambah pernyataan untuk
sebelum gelung
- - mungkin betul.
Saya boleh menukar
- kepada
Tunggu.for更改为for (int j = 1; j - mungkin betul.for循环或外部for循环之前添加一个 forjfordalam atau gelungforluarfor循环中将j更改为iidalam gelungfordalam - mungkin salah!Intinya, anda
perlu memahami perkara yang cuba dilakukan oleh kod anda untuk mencari pembetulan yang betul.4. Sebab tidak diketahui
Dalam beberapa kes berikut, "simbol tidak ditemui" kelihatan membingungkan... sehingga anda melihat lebih dekat.
Kebergantungan salah: Jika anda menggunakan IDE atau alat binaan yang menguruskan laluan binaan dan kebergantungan projek, anda mungkin telah membuat kesilapan dengan kebergantungan seperti meninggalkan kebergantungan atau memilih Versi yang salah. Jika anda menggunakan alat binaan (Ant, Maven, Gradle, dll.), semak fail binaan projek anda. Jika anda menggunakan IDE, semak konfigurasi laluan binaan projek anda.
Simbol 'var' tidak ditemui: Anda mungkin cuba menggunakan versi lama untuk menyusun menggunakan inferens jenis pembolehubah tempatan (iaitu
.var声明)的源代码编译器或更旧的--source级别。vartelah diperkenalkan dalam Java 10. Semak versi JDK anda dan bina fail juga ( Jika ini berlaku dalam IDE) Tetapan IDEAnda tidak menyusun/menghimpun semula: Kadangkala, pengaturcara Java baharu tidak memahami cara rantai alat Java berfungsi, atau tidak melaksanakan "proses binaan" yang boleh diulang cth . Dalam kes ini, pengaturcara mungkin akhirnya mengejar ralat hantu yang sebenarnya disebabkan oleh, sebagai contoh, tidak menyusun semula kod dengan betul.
Contoh lain ialah apabila anda menggunakan (Java 9+)
java SomeClass.java编译和运行类时。如果该类依赖于您尚未编译(或重新编译)的另一个类,则您可能会收到涉及第二类的“无法解析符号”错误。其他源文件不会自动编译。javaMod "Kompil dan Jalankan" arahan baharu tidak sesuai untuk menjalankan program dengan berbilang fail kod sumber.Isu Binaan Awal: Binaan awal mungkin gagal menyebabkan fail JAR tiada kelas. Jika anda menggunakan alat binaan, anda biasanya akan melihat kegagalan sedemikian. Walau bagaimanapun, jika anda memperoleh fail JAR daripada orang lain, anda bergantung pada mereka membina dengan betul dan menyedari ralat. Jika anda mengesyaki perkara ini, gunakan
tar -tvfuntuk menyenaraikan kandungan fail JAR yang disyaki.Isu IDE: Orang ramai telah melaporkan situasi di mana IDE mereka menjadi keliru dan pengkompil dalam IDE tidak dapat mencari kelas yang wujud... atau sebaliknya.
Ini mungkin berlaku jika IDE dikonfigurasikan dengan versi JDK yang salah.
Ini mungkin berlaku jika cache IDE tidak segerak dengan sistem fail. Terdapat beberapa cara khusus IDE untuk menyelesaikan masalah ini.
Ini mungkin pepijat IDE. Contohnya, @Joel Costigliola menerangkan senario di mana Eclipse gagal mengendalikan pokok "ujian" Maven dengan betul:Lihat jawapan ini. (Nampaknya pepijat ini telah dibetulkan lama dahulu.)
Masalah Android: Apabila anda memprogramkan untuk Android, jika anda menjumpai fail kelas yang berkaitan dengan
R相关的“找不到符号”错误,请注意R符号由context.xml文件定义。检查您的context.xml文件是否正确且位于正确的位置,以及是否已生成/编译相应的R. Ambil perhatian bahawa simbol Java adalah sensitif huruf besar-besaran, jadi id XML yang sepadan juga sensitif huruf besar-besaran.Ralat simbol lain pada Android mungkin disebabkan oleh sebab yang dinyatakan sebelum ini seperti kebergantungan yang hilang atau salah, nama pakej yang salah, kaedah atau medan yang tidak wujud dalam versi API tertentu, ralat ejaan/menaip, dsb.
Sembunyikan Kelas Sistem: Saya pernah melihat kes di mana pengkompil mengadu bahawa
substringadalah simbol yang tidak diketahui, seperti iniTernyata pengaturcara mencipta versi
Stringmereka sendiri dan versi kelasnya tidak mentakrifkan kaedahString版本,并且他的类版本没有定义substring方法。我见过人们使用System、Scanner. Saya telah melihat orang menggunakanSystem,Scannerdan kelas lain untuk melakukan ini.Pengajaran:Jangan tentukan kelas anda sendiri dengan nama yang sama dengan kelas perpustakaan awam!
Masalah ini juga boleh diselesaikan dengan menggunakan nama yang layak sepenuhnya. Contohnya, dalam contoh di atas, seorang pengaturcarabolehmenulis:
Homoglyphs:Jika anda menggunakan pengekodan UTF-8 untuk fail sumber anda, anda mungkin akan mendapat pengecam yangkelihatansama tetapi sebenarnya berbeza kerana ia mengandungi homoglyph. Sila lihathalaman iniuntuk maklumat lanjut.
Anda boleh mengelakkan perkara ini dengan mengehadkan diri anda kepada ASCII atau Latin-1 sebagai pengekodan fail sumber, dan menggunakan Java
uxxxxuntuk melepaskan aksara lain.1 - Jika andamelakukanmelihat ini dalam pengecualian masa jalan atau mesej ralat, anda telah mengkonfigurasikan IDE anda untuk menjalankan kod dengan ralat penyusunan, atau aplikasi anda sedang dibina dan disusun pada kod masa jalan.
2 - Tiga prinsip asas kejuruteraan awam: air tidak mengalir ke tempat yang lebih tinggi, papan menjadi lebih kuat apabila mereka berhadapan antara satu sama lain, dananda tidak boleh menolak tali.