Apakah yang dimaksud dengan kesalahan "Tidak dapat menemukan simbol" atau "Tidak dapat menyelesaikan simbol"?

395

Tolong jelaskan yang berikut tentang kesalahan "Tidak dapat menemukan simbol" dan "Tidak dapat menyelesaikan simbol":

  • Apa yang mereka maksud?
  • Hal-hal apa yang dapat menyebabkan mereka?
  • Bagaimana cara programmer memperbaiki mereka?

Pertanyaan ini dirancang untuk menyemai Q&A komprehensif tentang kesalahan kompilasi umum di Jawa ini.

Stephen C
sumber

Jawaban:

417

0. Apakah ada perbedaan antara kedua kesalahan?

Tidak juga. "Tidak dapat menemukan simbol" dan "Tidak dapat menyelesaikan simbol" memiliki arti yang sama. Beberapa kompiler Java menggunakan satu frase, dan beberapa yang lain.

1. Apa artinya kesalahan "Tidak dapat menemukan simbol"?

Pertama, ini adalah kesalahan kompilasi 1 . Ini berarti bahwa baik ada masalah dalam kode sumber Java Anda, atau ada masalah dalam cara yang Anda mengkompilasinya.

Kode sumber Java Anda terdiri dari hal-hal berikut:

  • Kata kunci: seperti true, false, class, while, dan sebagainya.
  • Literal: suka 42dan 'X'dan "Hi mum!".
  • Operator dan token non-alfanumerik lain: seperti +, =, {, dan sebagainya.
  • Pengidentifikasi: seperti Reader, i, toString, processEquibalancedElephants, dan sebagainya.
  • Komentar dan spasi putih.

Kesalahan "Tidak dapat menemukan simbol" adalah tentang pengidentifikasi. Ketika kode Anda dikompilasi, kompiler perlu mengetahui apa arti setiap pengidentifikasi dalam kode Anda.

Kesalahan "Tidak dapat menemukan simbol" berarti bahwa kompiler tidak dapat melakukan ini. Kode Anda tampaknya merujuk pada sesuatu yang tidak dimengerti oleh kompiler.

2. Apa yang dapat menyebabkan kesalahan "Tidak dapat menemukan simbol"?

Sebagai urutan pertama, hanya ada satu penyebab. Kompiler mencari di semua tempat di mana pengidentifikasi harus didefinisikan, dan tidak dapat menemukan definisi. Ini bisa disebabkan oleh beberapa hal. Yang umum adalah sebagai berikut:

  • Untuk pengidentifikasi secara umum:
    • Mungkin Anda salah mengeja namanya; yaitu StringBiulderbukannya StringBuilder. Java tidak dapat dan tidak akan mencoba mengkompensasi kesalahan pengejaan atau pengetikan yang buruk.
    • Mungkin Anda salah kasus; yaitu stringBuilderbukannya StringBuilder. Semua pengidentifikasi Java peka huruf besar-kecil.
    • Mungkin Anda menggunakan garis bawah secara tidak tepat; yaitu mystringdan my_stringberbeda. (Jika Anda tetap berpegang pada aturan gaya Java, sebagian besar Anda akan terlindungi dari kesalahan ini ...)
    • Mungkin Anda mencoba menggunakan sesuatu yang dinyatakan "di tempat lain"; yaitu dalam konteks yang berbeda ke tempat Anda secara implisit mengatakan kepada kompiler untuk melihat. (Kelas yang berbeda? Ruang lingkup yang berbeda? Paket yang berbeda? Pangkalan kode yang berbeda?)
  • Untuk pengidentifikasi yang harus merujuk ke variabel:
    • Mungkin Anda lupa mendeklarasikan variabel.
    • Mungkin deklarasi variabel berada di luar cakupan pada titik Anda mencoba menggunakannya. (Lihat contoh di bawah)
  • Untuk pengidentifikasi yang harus berupa metode atau nama bidang:

    • Mungkin Anda mencoba merujuk ke metode atau bidang yang diwarisi yang tidak dideklarasikan di kelas atau antarmuka leluhur / leluhur.
    • Mungkin Anda mencoba merujuk ke metode atau bidang yang tidak ada (yaitu belum dideklarasikan) dalam tipe yang Anda gunakan; mis . "someString".push()2 .
    • Mungkin Anda mencoba menggunakan metode sebagai bidang, atau sebaliknya; misalnya "someString".lengthatau someArray.length().
    • Mungkin Anda keliru beroperasi pada array daripada elemen array; misalnya

      String strings[] = ...
      if (strings.charAt(3)) { ... }
      // maybe that should be 'strings[0].charAt(3)'
  • Untuk pengidentifikasi yang harus berupa nama kelas:

    • Mungkin Anda lupa mengimpor kelas.
    • Mungkin Anda menggunakan impor "bintang", tetapi kelas tidak didefinisikan di salah satu paket yang Anda impor.
    • Mungkin Anda lupa a newseperti pada:

      String s = String();  // should be 'new String()'
  • Untuk kasus di mana jenis atau instance tampaknya tidak memiliki anggota yang Anda harapkan memiliki:

    • Mungkin Anda telah mendeklarasikan kelas bersarang atau parameter umum yang membayangi tipe yang ingin Anda gunakan.
    • Mungkin Anda membayangi variabel statis atau instan.
    • Mungkin Anda mengimpor jenis yang salah; misalnya karena penyelesaian IDE atau koreksi otomatis.
    • Mungkin Anda menggunakan (kompilasi melawan) versi API yang salah.
    • Mungkin Anda lupa melemparkan objek ke subkelas yang sesuai.

Masalahnya sering merupakan kombinasi dari yang di atas. Sebagai contoh, mungkin Anda "membintangi" diimpor java.io.*dan kemudian mencoba menggunakan Fileskelas ... yang java.niotidak java.io. Atau mungkin Anda bermaksud menulis File... yang merupakan kelas di java.io.


Berikut adalah contoh bagaimana pelingkupan variabel yang salah dapat menyebabkan kesalahan "Tidak dapat menemukan simbol":

List<String> strings = ...

for (int i = 0; i < strings.size(); i++) {
    if (strings.get(i).equalsIgnoreCase("fnord")) {
        break;
    }
}
if (i < strings.size()) {
    ...
}

Ini akan memberikan kesalahan "Tidak dapat menemukan simbol" untuk idalam ifpernyataan. Meskipun kami sebelumnya menyatakan i, deklarasi itu hanya dalam ruang lingkup untuk forpernyataan dan badannya. Referensi idalam ifpernyataan tidak dapat melihat deklarasi itu i. Itu di luar jangkauan .

(Koreksi yang tepat di sini mungkin untuk memindahkan ifpernyataan di dalam loop, atau untuk menyatakan isebelum dimulainya loop.)


Berikut adalah contoh yang menyebabkan kebingungan di mana kesalahan ketik menyebabkan kesalahan yang tampaknya tidak dapat dijelaskan: "Tidak dapat menemukan simbol":

for (int i = 0; i < 100; i++); {
    System.out.println("i is " + i);
}

Ini akan memberi Anda kesalahan kompilasi dalam printlnpanggilan yang mengatakan bahwa itidak dapat ditemukan. Tetapi (saya mendengar Anda berkata) saya menyatakannya!

Masalahnya adalah titik koma licik ( ;) sebelum {. Sintaks bahasa Java mendefinisikan titik koma dalam konteks itu menjadi pernyataan kosong . Pernyataan kosong kemudian menjadi badan forloop. Jadi kode itu sebenarnya berarti ini:

for (int i = 0; i < 100; i++); 

// The previous and following are separate statements!!

{
    System.out.println("i is " + i);
}

The { ... }blok TIDAK tubuh forlingkaran, dan oleh karena itu deklarasi sebelumnya idalam forpernyataan keluar dari ruang lingkup di blok tersebut.


Berikut adalah contoh lain dari kesalahan "Tidak dapat menemukan simbol" yang disebabkan oleh kesalahan ketik.

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

Meskipun deklarasi sebelumnya, tmpdalam tmp(...)ungkapan itu keliru. Kompiler akan mencari metode yang disebut tmp, dan tidak akan menemukannya. Yang dideklarasikan sebelumnya tmpadalah dalam namespace untuk variabel, bukan namespace untuk metode.

Dalam contoh yang saya temui, programmer sebenarnya telah meninggalkan operator. Apa yang ingin ia tulis adalah ini:

int res = tmp * (a + b);

Ada alasan lain mengapa kompiler mungkin tidak menemukan simbol jika Anda mengkompilasi dari baris perintah. Anda mungkin lupa kompilasi atau kompilasi ulang beberapa kelas lain. Misalnya, jika Anda memiliki kelas Foodan di Barmana Foomenggunakan Bar. Jika Anda belum pernah mengkompilasi Bardan menjalankan javac Foo.java, Anda dapat menemukan bahwa kompiler tidak dapat menemukan simbol Bar. Jawaban sederhananya adalah mengkompilasi Foodan Barbersama - sama; misalnya javac Foo.java Bar.javaatau javac *.java. Atau lebih baik lagi menggunakan alat Java build; misal Ant, Maven, Gradle dan sebagainya.

Ada beberapa penyebab lain yang lebih tidak jelas ... yang akan saya bahas di bawah ini.

3. Bagaimana cara memperbaiki kesalahan ini?

Secara umum, Anda mulai dengan mencari tahu apa yang menyebabkan kesalahan kompilasi.

  • Lihatlah baris dalam file yang ditunjukkan oleh pesan kesalahan kompilasi.
  • Identifikasi simbol mana yang dibicarakan oleh pesan kesalahan.
  • Cari tahu mengapa kompiler mengatakan bahwa ia tidak dapat menemukan simbol; Lihat di atas!

Kemudian Anda berpikir tentang apa yang seharusnya dikatakan oleh kode Anda. Lalu akhirnya Anda mencari koreksi apa yang perlu Anda lakukan untuk kode sumber Anda untuk melakukan apa yang Anda inginkan.

Perhatikan bahwa tidak setiap "koreksi" benar. Pertimbangkan ini:

for (int i = 1; i < 10; i++) {
    for (j = 1; j < 10; j++) {
        ...
    }
}

Misalkan kompiler mengatakan "Tidak dapat menemukan simbol" untuk j. Ada banyak cara saya bisa "memperbaiki" itu:

  • Aku bisa mengubah batin foruntuk for (int j = 1; j < 10; j++)- mungkin benar.
  • Saya bisa menambahkan deklarasi untuk j sebelumfor loop dalam , atau forloop luar - mungkin benar.
  • Saya dapat mengubah jke idalam forlingkaran dalam - mungkin salah!
  • dan seterusnya.

Intinya adalah bahwa Anda perlu memahami apa yang kode Anda coba lakukan untuk menemukan perbaikan yang tepat.

4. Penyebab yang tidak jelas

Berikut adalah beberapa kasus di mana "Tidak dapat menemukan simbol" tampaknya tidak dapat dijelaskan ... sampai Anda melihat lebih dekat.

  1. Ketergantungan yang salah : Jika Anda menggunakan IDE atau alat build yang mengelola path build dan dependensi proyek, Anda mungkin telah membuat kesalahan dengan dependensi; mis. meninggalkan ketergantungan, atau memilih versi yang salah. Jika Anda menggunakan alat build (Ant, Maven, Gradle, dll), periksa file build proyek. Jika Anda menggunakan IDE, periksa konfigurasi path build proyek.

  2. Anda tidak mengkompilasi ulang : Terkadang terjadi bahwa programmer Java yang baru tidak memahami bagaimana rantai alat Java bekerja, atau belum menerapkan "proses pembangunan" yang berulang; misal menggunakan IDE, Ant, Maven, Gradle dan sebagainya. Dalam situasi seperti itu, programmer dapat akhirnya mengejar ekornya mencari kesalahan ilusi yang sebenarnya disebabkan oleh tidak mengkompilasi ulang kode dengan benar, dan sejenisnya ...

  3. Masalah build sebelumnya : Ada kemungkinan bahwa build sebelumnya gagal dengan cara yang memberikan file JAR dengan kelas yang hilang. Kegagalan seperti itu biasanya akan diperhatikan jika Anda menggunakan alat build. Namun jika Anda mendapatkan file JAR dari orang lain, Anda bergantung padanya untuk membangun dengan benar, dan memperhatikan kesalahan. Jika Anda mencurigai ini, gunakan tar -tvfuntuk membuat daftar isi file JAR yang dicurigai.

  4. Masalah IDE : Orang-orang telah melaporkan kasus di mana IDE mereka menjadi bingung dan kompiler di IDE tidak dapat menemukan kelas yang ada ... atau situasi sebaliknya.

    • Ini bisa terjadi jika IDE telah dikonfigurasi dengan versi JDK yang salah.

    • Ini bisa terjadi jika cache IDE tidak sinkron dengan sistem file. Ada cara khusus IDE untuk memperbaikinya.

    • Ini bisa menjadi bug IDE. Misalnya @ Joel Costigliola menjelaskan skenario di mana Eclipse tidak menangani pohon "tes" Maven dengan benar: lihat jawaban ini .

  5. Masalah Android : Saat Anda memprogram untuk Android, dan Anda memiliki kesalahan "Tidak dapat menemukan simbol" yang terkait R, perlu diketahui bahwa Rsimbol ditentukan oleh context.xmlfile. Periksa apakah context.xmlfile Anda benar dan di tempat yang benar, dan bahwa Rfile kelas yang sesuai telah dihasilkan / dikompilasi. Perhatikan bahwa simbol Java peka terhadap huruf besar-kecil, sehingga id XML yang terkait juga peka terhadap huruf besar-kecil.

    Kesalahan simbol lain pada Android kemungkinan disebabkan oleh alasan yang disebutkan sebelumnya; mis. dependensi yang hilang atau salah, nama paket salah, metode atau bidang yang tidak ada dalam versi API tertentu, kesalahan pengejaan / pengetikan, dan sebagainya.

  6. Mendefinisikan ulang kelas sistem : Saya telah melihat kasus-kasus di mana kompiler mengeluh bahwa itu substringadalah simbol yang tidak dikenal dalam sesuatu seperti berikut ini

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

    Ternyata programmer telah membuat versinya sendiri Stringdan versinya tentang kelas tidak mendefinisikan substringmetode.

    Pelajaran: Jangan mendefinisikan kelas Anda sendiri dengan nama yang sama dengan kelas perpustakaan umum!

  7. Homoglyphs: Jika Anda menggunakan pengkodean UTF-8 untuk file sumber Anda, dimungkinkan untuk memiliki pengidentifikasi yang terlihat sama, tetapi pada kenyataannya berbeda karena mengandung homoglyphs. Lihat halaman ini untuk informasi lebih lanjut.

    Anda dapat menghindari ini dengan membatasi diri Anda ke ASCII atau Latin-1 sebagai pengkodean file sumber, dan menggunakan Java \uxxxxescapes untuk karakter lain.


1 - Jika, barangkali, Anda jangan melihat ini dalam pengecualian runtime atau pesan error, maka baik Anda telah mengkonfigurasi IDE Anda untuk menjalankan kode dengan kesalahan kompilasi, atau aplikasi Anda menghasilkan dan kode kompilasi .. pada saat runtime.

2 - Tiga prinsip dasar Teknik Sipil: air tidak mengalir menanjak, papan lebih kuat di sisinya, dan Anda tidak bisa mendorong tali .

Stephen C
sumber
Saya punya situasi lain di mana kesalahan kompilasi ini terjadi sementara eclipse tidak melihat masalah: Dua kelas dengan dependensi didefinisikan di masing-masing kelas lainnya. Dalam kasus saya, saya memiliki enum, mengimplementasikan antarmuka, didefinisikan dalam kelas di mana saya bodoh sudah menggunakan enum.
Jogi
Agak mirip dengan komentar di atas, ketika saya mengkompilasi dan menjalankan program saya dari Eclipse tidak ada masalah. Mengompilasinya dari konsol menimbulkan banyak kesalahan "Tidak dapat menemukan simbol" yang sering dikaitkan dengan elemen terakhir dalam impor. Saya tidak tahu apa yang menyebabkan ini karena tidak ada yang salah dalam kode sebenarnya.
Andres Stadelmann
Masalah lain adalah bahwa IDE dapat "menafsirkan" kesalahan lain ke dalam kategori ini. Misalnya printlndi System.out.printlnjika ditempatkan di tingkat kelas bawah compiler standar akan memberi kita <identifier> expected( demo ) tapi di IntelliJ kita akan melihat Cannot resolve symbol 'println'( demo ).
Pshemo
Wow. Saya akan menyebutnya bug kompiler.
Stephen C
23

Anda juga akan mendapatkan kesalahan ini jika Anda lupa new:

String s = String();

melawan

String s = new String();

karena panggilan tanpa newkata kunci akan mencoba dan mencari metode (lokal) yang dipanggil Stringtanpa argumen - dan metode tanda tangan itu kemungkinan tidak ditentukan.

pemikir
sumber
14

Satu lagi contoh 'Variabel di luar ruang lingkup'

Seperti yang telah saya lihat beberapa pertanyaan semacam itu beberapa kali, mungkin satu contoh lagi untuk apa yang ilegal bahkan jika mungkin terasa baik - baik saja.

Pertimbangkan kode ini:

if(somethingIsTrue()) {
  String message = "Everything is fine";
} else {
  String message = "We have an error";
}
System.out.println(message);

Itu kode yang tidak valid. Karena tak satu pun dari variabel bernama messageterlihat di luar ruang lingkup masing-masing - yang akan menjadi tanda kurung sekitarnya {}dalam kasus ini.

Anda mungkin mengatakan: "Tetapi variabel bernama pesan didefinisikan dengan cara baik - sehingga pesan yang didefinisikan setelah if".

Tapi kamu salah.

Java tidak memiliki free()atau deleteoperator, jadi ia harus bergantung pada pelacakan lingkup variabel untuk mengetahui kapan variabel tidak lagi digunakan (bersama dengan referensi ke variabel penyebab ini).

Ini sangat buruk jika Anda berpikir Anda melakukan sesuatu yang baik. Saya telah melihat kesalahan semacam ini setelah "mengoptimalkan" kode seperti ini:

if(somethingIsTrue()) {
  String message = "Everything is fine";
  System.out.println(message);
} else {
  String message = "We have an error";
  System.out.println(message);
}

"Oh, ada kode duplikat, mari kita tarik garis umum keluar" -> dan di sana itu.

Cara paling umum untuk menangani jenis masalah lingkup ini adalah dengan melakukan pra-tetapkan nilai-nilai lain ke nama-nama variabel dalam lingkup luar dan kemudian ditugaskan kembali jika:

String message = "We have an error";
if(somethingIsTrue()) {
  message = "Everything is fine";
} 
System.out.println(message);
Jan
sumber
4
"Java tidak memiliki operator bebas () atau menghapus, jadi ia harus bergantung pada ruang lingkup pelacakan variabel untuk mengetahui kapan variabel tidak lagi digunakan (bersama dengan referensi ke variabel penyebab ini)." - Meskipun benar, ini tidak relevan. C dan C ++ masing-masing memiliki operator bebas / hapus, namun kode C / C ++ yang setara untuk contoh Anda akan ilegal. Blok C dan C ++ membatasi ruang lingkup variabel seperti di Jawa. Sebenarnya, ini berlaku untuk sebagian besar bahasa "blok terstruktur".
Stephen C
1
Solusi yang lebih baik untuk kode yang memberikan nilai berbeda pada setiap cabang adalah dengan menggunakan deklarasi variabel kosongfinal .
Daniel Pryden
10

Salah satu cara untuk mendapatkan kesalahan ini di Eclipse:

  1. Tentukan kelas Adi src/test/java.
  2. Tentukan kelas lain Bdi kelas src/main/javayang menggunakan A.

Hasil: Eclipse akan mengkompilasi kode, tetapi maven akan memberikan "Tidak dapat menemukan simbol".

Penyebab mendasar: Eclipse menggunakan jalur build gabungan untuk pohon utama dan uji. Sayangnya, itu tidak mendukung penggunaan jalur pembangunan yang berbeda untuk bagian proyek Eclipse yang berbeda, yang diperlukan oleh Maven.

Solusi:

  1. Jangan mendefinisikan dependensi Anda seperti itu; yaitu jangan membuat kesalahan ini.
  2. Secara teratur membangun basis kode Anda menggunakan Maven sehingga Anda mengambil kesalahan ini lebih awal. Salah satu cara untuk melakukannya adalah dengan menggunakan server CI.
Joel Costigliola
sumber
Apa solusi untuk yang ini?
2
apa pun yang Anda gunakan di src / main / java perlu didefinisikan dalam src / main / java atau dalam setiap kompilasi / runtime dependensi (bukan dependensi uji).
Joel Costigliola
5

"Tidak dapat menemukan" berarti bahwa, kompiler yang tidak dapat menemukan variabel yang sesuai, metode, kelas dll ... jika Anda mendapatkan pijatan kesalahan, pertama-tama Anda ingin menemukan baris kode di mana mendapatkan pijatan kesalahan .. Dan kemudian Anda akan dapat menemukan variabel, metode, atau kelas mana yang belum ditentukan sebelum menggunakannya. Setelah konfirmasi, inisialisasi variabel, metode, atau kelas tersebut nanti dapat digunakan ... Pertimbangkan contoh berikut.

Saya akan membuat kelas demo dan mencetak nama ...

class demo{ 
      public static void main(String a[]){
             System.out.print(name);
      }
}

Sekarang lihat hasilnya ..

masukkan deskripsi gambar di sini

Kesalahan itu mengatakan, "nama variabel tidak dapat menemukan" .. Menentukan dan menginisialisasi nilai untuk variabel 'nama' dapat menghapus kesalahan itu .. Sebenarnya seperti ini,

class demo{ 
      public static void main(String a[]){

             String name="smith";

             System.out.print(name);
      }
}

Sekarang lihat output baru ...

masukkan deskripsi gambar di sini

Ok Berhasil menyelesaikan kesalahan itu..Pada saat yang sama, jika Anda bisa mendapatkan "tidak dapat menemukan metode" atau "tidak dapat menemukan kelas" sesuatu, Pada awalnya, tentukan kelas atau metode dan setelah menggunakannya ..

GT_hash
sumber
3

Jika Anda mendapatkan kesalahan ini di build di tempat lain, sementara IDE Anda mengatakan semuanya baik-baik saja, maka periksa apakah Anda menggunakan versi Java yang sama di kedua tempat.

Misalnya, Java 7 dan Java 8 memiliki API yang berbeda, jadi memanggil API yang tidak ada dalam versi Java yang lebih lama akan menyebabkan kesalahan ini.

Jonathan Lin
sumber
2

Saya juga mendapatkan kesalahan ini. (yang saya cari Google dan saya diarahkan ke halaman ini)

Masalah: Saya memanggil metode statis yang didefinisikan dalam kelas proyek A dari kelas yang ditentukan dalam proyek lain B. Saya mendapatkan kesalahan berikut:

error: cannot find symbol

Solusi: Saya menyelesaikan ini dengan terlebih dahulu membangun proyek tempat metode didefinisikan kemudian proyek tempat metode itu dipanggil.

Divya Jose
sumber
Ya, ini bisa terjadi jika Anda memutuskan untuk memindahkan beberapa fungsi yang dapat digunakan kembali dari paket Anda saat ini ke paket utilitas umum Anda, misalnya, tetapi kemudian Anda lupa untuk mengkompilasi paket umum Anda sebelum memanggil fungsi dari paket Anda saat ini.
buildingKofi
2

Jika eclipse Java build path dipetakan ke 7, 8 dan di Project pom.xml properti Maven java.version disebutkan versi Java yang lebih tinggi (9,10,11, dll.,) Dari 7,8 Anda perlu memperbarui di pom. file xml.

Dalam Eclipse jika Java dipetakan ke Java versi 11 dan di pom.xml dipetakan ke Java versi 8. Perbarui dukungan Eclipse ke Java 11 dengan melalui langkah-langkah di bawah ini di eclipse IDE Help -> Install New Software ->

Tempel tautan berikut http://download.eclipse.org/eclipse/updates/4.9-P-builds at Work With

atau

Tambah (Jendela sembulan akan terbuka) ->

Name:Java 11 mendukung Location: http://download.eclipse.org/eclipse/updates/4.9-P-builds

kemudian perbarui versi Java di properti Maven file pom.xml seperti di bawah ini

<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>

Akhirnya lakukan klik kanan pada proyek Debug sebagai -> Maven bersih, langkah membangun Maven

UdayKiran Pulipati
sumber
2

TERPECAHKAN

Pilih Build -> Rebuild Project akan menyelesaikannya

Ajay
sumber
1
Itu sangat tergantung dan biasanya tidak.
Maarten Bodewes
1

Mungkin ada berbagai skenario seperti yang disebutkan orang di atas. Beberapa hal yang telah membantu saya menyelesaikan ini.

  1. Jika Anda menggunakan IntelliJ

    File -> 'Invalidate Caches/Restart'

ATAU

  1. Kelas yang dirujuk ada di proyek lain dan ketergantungan itu tidak ditambahkan ke file build Gradle proyek saya. Jadi saya menambahkan ketergantungan menggunakan

    compile project(':anotherProject')

dan itu berhasil. HTH!

rata-rata
sumber
1

Anda mengkompilasi kode Anda menggunakan maven mengkompilasi dan kemudian menggunakan uji maven untuk menjalankannya bekerja dengan baik. Sekarang jika Anda mengubah sesuatu dalam kode Anda dan kemudian tanpa kompilasi Anda menjalankannya, Anda akan mendapatkan kesalahan ini.

Solusi: Sekali lagi kompilasi dan jalankan uji. Bagi saya itu bekerja dengan cara ini.

ANIL KUMAR
sumber
1

Dalam kasus saya - saya harus melakukan operasi di bawah ini:

  1. Pindahkan context.xmlfile dari src/java/packageke resourcedirektori (IntelliJ IDE)
  2. Bersihkan targetdirektori.
VIPIN KUMAR
sumber
Memindahkan file tanpa memperhatikan referensi dapat menyebabkan kesalahan ini. Saya sudah bertemu ini. Cukup Atur Ulang pada Git dan Pindahkan lagi dengan hati-hati, kesalahannya terpecahkan.
Huy Hóm Hỉnh
0

Untuk petunjuk, lihat lebih dekat pada nama kelas yang melempar kesalahan dan nomor baris, contoh: Kegagalan kompilasi [ERROR] \ application \ xxxxx.java: [44,30] galat: tidak dapat menemukan simbol

Salah satu penyebab lainnya adalah metode yang tidak didukung untuk versi java katakanlah jdk7 vs 8. Periksa% JAVA_HOME Anda

Striker
sumber
Ini hanya mengatakan hal yang sama dengan jawaban lain.
Stephen C