Apakah yang dimaksudkan dengan ralat "simbol tidak ditemui" atau "tidak dapat menyelesaikan simbol"?
P粉106711425
P粉106711425 2023-10-09 13:52:29
0
2
989

Sila terangkan perkara berikut tentang ralat "simbol tidak ditemui", "tidak dapat menyelesaikan simbol" atau "simbol tidak ditemui" (dalam Java):

  • Apakah maksudnya?
  • Apakah faktor yang boleh menyebabkan masalah ini?
  • Bagaimanakah pengaturcara menyelesaikan masalah ini?

Soalan ini bertujuan untuk menyediakan Soal Jawab yang komprehensif tentang ralat kompilasi biasa di Jawa ini.

P粉106711425
P粉106711425

membalas semua (2)
P粉203792468

Jika anda terlupanewanda juga akan mendapat ralat ini:

String s = String();

Perbandingan

String s = new String();

Oleh kerana panggilan tanpa kata kuncinew关键字的调用将尝试查找不带参数的名为Stringakan cuba mencari kaedah (asli) bernamaStringyang tidak mengambil parameter - dan tandatangan kaedah itu mungkin tidak ditentukan. p>

    P粉946437474

    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: Contohnyaclasswhiledll.
    • Teks: Sepertitruefalse42'X'“嗨妈妈!”.
    • pengendali dan token bukan abjad lain: cth.+={
    • Pengecam: Contohnya
    • dll.ReaderitoStringprocessEquibalancedElephants
    • 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:

    • Untuk pengecam umum:

        Mungkin nama anda dieja dengan betul; Java tidak boleh dan tidak cuba untuk mengimbangi kesilapan ejaan atau kesilapan tipografi.
      • StringBiulder而不是StringBuilderMungkin anda salah faham; Semua pengecam Java adalah sensitif huruf besar-besaran.
      • Mungkin anda menggunakan garis bawah dengan salah; iaitustringBuilder而不是StringBuilderberbeza. (Jika anda berpegang kepada peraturan gaya Java, anda akan mengelakkan kesilapan ini...)
      • 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?)mystringmy_string
      Untuk pengecam yang harus merujuk pembolehubah:
    • Mungkin 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:
    • 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

        ."rope".push()

      • Mungkin anda cuba menggunakan kaedah sebagai medan atau sebaliknya"rope".lengthsomeArray.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 satunewseperti ini:

        String s = String(); // should be 'new String()'
      • Mungkin anda cuba mengimport atau sebaliknya menggunakan kelas yang telah diisytiharkan dalam pakej lalai iaitu di mana kelas tanpa pernyataanpackageberada.

        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:

      • 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.java.awt.List而不是java.util.List
      • 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 dalam

    .java.io.*,然后尝试使用Files类...它位于java.nio代码>而不是java.io。或者,也许您打算编写File...,它是java.io


    Contoh 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
                idalam pernyataan
                if. Walaupun kami mengisytiharkan
                ilebih awal, pengisytiharan itu hanyalah
                
                 untuk pernyataan dan isinya
                 

    skopif语句中为i提供“找不到符号”错误。尽管我们之前声明了i,但该声明仅for语句及其主体范围if语句中对i的引用看不到i. Rujukan kepadaidalam pernyataaniftidak dapat melihatpengisytiharani. Ia

    di luar skop

    .if语句移至循环内部,或在循环开始之前声明i

    (Pembetulan yang sesuai di sini mungkin untuk
    .)

    Berikut ialah contoh mengelirukan apabila kesilapan menaip menyebabkan ralat "simbol tidak ditemui" yang kelihatan tidak dapat dijelaskan:println调用中给您一个编译错误,指出无法找到i

    for (int i = 0; i Ini akan berada dalam . Tetapi (saya dengar anda berkata) saya telah mengumumkannya!

    Masalahnya ialah{之前的分号 (;)。 Java 语言语法将该上下文中的分号定义为空语句。然后,空语句将成为forbadan gelung. Jadi kod ini sebenarnya bermaksud:

    for (int i = 0; i

    { ... }块不是for循环的主体,因此之前在i中的声明code>for Kenyataanadalah di luar skopblok.


    Ini adalah satu lagi contoh ralat "simbol tidak ditemui" yang disebabkan oleh kesilapan menaip.

    int tmp = ... int res = tmp(a + b);

    Walaupun pengisytiharan sebelumnya,tmp(...)表达式中的tmp是错误的。编译器将查找名为tmp的方法,但找不到。之前声明的tmpberada dalam ruang nama pembolehubah, bukan ruang nama kaedah.

    Dalam contoh yang saya temui, pengaturcara sebenarnya meninggalkan operator. Apa yang dia ingin tulis pada asalnya ialah:

    int res = tmp * (a + b);

    Ada satu lagi sebab mengapa pengkompil mungkin tidak menemui simbol jika menyusun daripada baris arahan. Anda mungkin terlupa untuk menyusun atau menyusun semula beberapa kelas lain. Sebagai contoh, jika anda mempunyai kelasFooBar,其中Foo使用Bar。如果您从未编译过Bar并且运行javac Foo.java,您很容易发现编译器找不到符号Bar。简单的答案是将FooBar一起编译;例如javac Foo.java Bar.javajavac *.java. Atau lebih baik masih menggunakan alat binaan Java seperti Ant, Maven, Gradle, dll.

    Ada beberapa sebab lain yang lebih kabur... yang akan saya bincangkan di bawah.

    3. Bagaimana untuk membetulkan ralat ini?

    Secara umumnya, anda perlu mengetahuiapa yang menyebabkanralat kompilasi.

    • Lihat baris dalam fail yang ditunjukkan oleh mesej ralat kompilasi.
    • Tentukan simbol yang dimaksudkan oleh mesej ralat.
    • Ketahuimengapapengkompil mengatakan simbol tidak dapat ditemui;

    Kemudian 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:

    for (int i = 1; i

    Andaikan pengkompil menggesa "simbol tidak ditemui" untukj. Terdapat banyak cara saya boleh "membetulkan" perkara ini:

    • Saya boleh meletakkan dalamanfor更改为for (int j = 1; j - mungkin betul.
    • Saya boleh menambah pernyataan untukfor循环或外部for循环之前添加一个 forj
    • sebelum gelung fordalam atau gelung forluar
    • - mungkin betul.for循环中将j更改为i
    • Saya boleh menukar
    • kepadaidalam gelungfordalam - mungkin salah!
    Tunggu.

    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.

    1. 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.

    2. Simbol 'var' tidak ditemui: Anda mungkin cuba menggunakan versi lama untuk menyusun menggunakan inferens jenis pembolehubah tempatan (iaituvar声明)的源代码编译器或更旧的--source级别。vartelah diperkenalkan dalam Java 10. Semak versi JDK anda dan bina fail juga ( Jika ini berlaku dalam IDE) Tetapan IDE

      .
    3. Anda 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.

    4. 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, gunakantar -tvfuntuk menyenaraikan kandungan fail JAR yang disyaki.

    5. 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.)

    6. Masalah Android: Apabila anda memprogramkan untuk Android, jika anda menjumpai fail kelas yang berkaitan denganR相关的“找不到符号”错误,请注意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.

    7. Sembunyikan Kelas Sistem: Saya pernah melihat kes di mana pengkompil mengadu bahawasubstringadalah simbol yang tidak diketahui, seperti ini

      String s = ... String s1 = s.substring(1);

      Ternyata pengaturcara mencipta versiStringmereka sendiri dan versi kelasnya tidak mentakrifkan kaedahString版本,并且他的类版本没有定义substring方法。我见过人们使用SystemScanner. 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:

      java.lang.String s = ... java.lang.String s1 = s.substring(1);
    8. 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 Javauxxxxuntuk 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.

      Muat turun terkini
      Lagi>
      kesan web
      Kod sumber laman web
      Bahan laman web
      Templat hujung hadapan
      Tentang kita Penafian Sitemap
      Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!