ข้อผิดพลาด“ ไม่พบสัญลักษณ์” หรือ“ ไม่สามารถแก้ไขสัญลักษณ์” หมายความว่าอย่างไร

Sep 07 2014

โปรดอธิบายต่อไปนี้เกี่ยวกับข้อผิดพลาด "ไม่พบสัญลักษณ์", "ไม่สามารถแก้ไขสัญลักษณ์" หรือ "ไม่พบสัญลักษณ์":

  • พวกเขาหมายถึงอะไร?
  • สิ่งใดที่สามารถทำให้เกิดพวกเขา?
  • โปรแกรมเมอร์จะแก้ไขอย่างไร

คำถามนี้ออกแบบมาเพื่อสร้างคำถามและคำตอบที่ครอบคลุมเกี่ยวกับข้อผิดพลาดในการคอมไพล์ทั่วไปใน Java

คำตอบ

441 StephenC Sep 07 2014 at 08:12

0. ข้อผิดพลาดทั้งสองมีความแตกต่างกันหรือไม่?

ไม่จริง. "ไม่พบสัญลักษณ์", "ไม่สามารถแก้ไขสัญลักษณ์" และ "ไม่พบสัญลักษณ์" ทั้งหมดหมายถึงสิ่งเดียวกัน คอมไพเลอร์ Java ที่แตกต่างกันใช้วลีที่แตกต่างกัน

1. ข้อผิดพลาด "ไม่พบสัญลักษณ์" หมายถึงอะไร?

ประการแรกก็คือการรวบรวมข้อผิดพลาด 1 ก็หมายความว่าทั้งสองมีปัญหาในโค้ด Java ของคุณหรือมีปัญหาในทางที่คุณกำลังรวบรวมมัน

ซอร์สโค้ด Java ของคุณประกอบด้วยสิ่งต่อไปนี้:

  • คำสำคัญ: เช่นtrue, false, class, whileและอื่น ๆ
  • ตัวอักษร: like 42and 'X'and "Hi mum!".
  • ผู้ประกอบการและราชสกุลไม่ใช่ตัวเลขอื่น ๆ เช่น+, =, {และอื่น ๆ
  • ตัวบ่งชี้: เช่นReader, i, toString, processEquibalancedElephantsและอื่น ๆ
  • ความคิดเห็นและช่องว่าง

ข้อผิดพลาด "ไม่พบสัญลักษณ์" เป็นเรื่องเกี่ยวกับตัวระบุ เมื่อคอมไพล์โค้ดของคุณคอมไพลเลอร์จะต้องค้นหาว่าตัวระบุแต่ละตัวในโค้ดของคุณหมายถึงอะไร

ข้อผิดพลาด "ไม่พบสัญลักษณ์" หมายความว่าคอมไพเลอร์ไม่สามารถดำเนินการนี้ได้ ดูเหมือนโค้ดของคุณจะอ้างถึงสิ่งที่คอมไพเลอร์ไม่เข้าใจ

2. อะไรทำให้เกิดข้อผิดพลาด "ไม่พบสัญลักษณ์"

เป็นลำดับแรกมีเพียงสาเหตุเดียว คอมไพเลอร์ตรวจสอบในทุกตำแหน่งที่ควรกำหนดตัวระบุและไม่พบคำจำกัดความ ซึ่งอาจเกิดจากหลายสิ่ง คนทั่วไปมีดังนี้:

  • สำหรับตัวระบุโดยทั่วไป:

    • บางทีคุณอาจสะกดชื่อไม่ถูกต้อง คือStringBiulderแทนStringBuilder. Java ไม่สามารถและจะไม่พยายามชดเชยการสะกดผิดหรือการพิมพ์ผิดพลาด
    • บางทีคุณอาจเข้าใจผิด คือstringBuilderแทนStringBuilder. ตัวระบุ Java ทั้งหมดคำนึงถึงขนาดตัวพิมพ์
    • บางทีคุณอาจใช้เครื่องหมายขีดล่างอย่างไม่เหมาะสม กล่าวคือmystringและmy_stringแตกต่างกัน (หากคุณยึดติดกับกฎสไตล์ Java คุณจะได้รับการปกป้องอย่างมากจากความผิดพลาดนี้ ... )
    • บางทีคุณอาจพยายามใช้สิ่งที่ประกาศว่า "ที่อื่น" กล่าวคือในบริบทที่แตกต่างกับที่คุณบอกโดยปริยายให้คอมไพเลอร์ดู (คลาสที่แตกต่างกันขอบเขตที่แตกต่างกันแพ็คเกจที่แตกต่างกันรหัสฐานที่แตกต่างกัน)
  • สำหรับตัวระบุที่ควรอ้างถึงตัวแปร:

    • บางทีคุณอาจลืมประกาศตัวแปร
    • บางทีการประกาศตัวแปรจะอยู่นอกขอบเขต ณ จุดที่คุณพยายามใช้ (ดูตัวอย่างด้านล่าง)
  • สำหรับตัวระบุที่ควรเป็นเมธอดหรือชื่อฟิลด์:

    • บางทีคุณอาจกำลังพยายามอ้างถึงวิธีการหรือฟิลด์ที่สืบทอดมาซึ่งไม่ได้ประกาศไว้ในคลาสหรืออินเทอร์เฟซของพาเรนต์ / บรรพบุรุษ

    • บางทีคุณอาจพยายามอ้างถึงวิธีการหรือเขตข้อมูลที่ไม่มีอยู่ (เช่นยังไม่ได้รับการประกาศ) ในประเภทที่คุณใช้ เช่น"someString".push()2 .

    • บางทีคุณอาจพยายามใช้วิธีการเป็นเขตข้อมูลหรือในทางกลับกัน เช่น"someString".lengthหรือsomeArray.length().

    • บางทีคุณอาจทำงานผิดพลาดในอาร์เรย์มากกว่าองค์ประกอบอาร์เรย์ เช่น

          String strings[] = ...
          if (strings.charAt(3)) { ... }
          // maybe that should be 'strings[0].charAt(3)'
      
  • สำหรับตัวระบุที่ควรเป็นชื่อคลาส:

    • บางทีคุณอาจลืมนำเข้าชั้นเรียน

    • บางทีคุณอาจใช้การนำเข้า "ติดดาว" แต่คลาสไม่ได้กำหนดไว้ในแพ็กเกจใด ๆ ที่คุณนำเข้า

    • บางทีคุณอาจลืมnewใน:

          String s = String();  // should be 'new String()'
      
  • สำหรับกรณีที่ประเภทหรืออินสแตนซ์ไม่ปรากฏว่ามีสมาชิกที่คุณคาดหวังให้มี:

    • บางทีคุณอาจจะมีการประกาศให้เป็นชั้นซ้อนกันหรือพารามิเตอร์ทั่วไปที่เงาชนิดที่คุณหมายถึงการใช้
    • บางทีคุณอาจกำลังเงาตัวแปรแบบคงที่หรืออินสแตนซ์
    • บางทีคุณอาจนำเข้าผิดประเภท เช่นเนื่องจาก IDE เสร็จสมบูรณ์หรือแก้ไขอัตโนมัติ
    • บางทีคุณอาจใช้ (คอมไพล์เทียบกับ) เวอร์ชันที่ไม่ถูกต้องของ API
    • บางทีคุณอาจลืมโยนวัตถุของคุณไปยังคลาสย่อยที่เหมาะสม

ปัญหามักเกิดจากการผสมผสานข้างต้น ยกตัวอย่างเช่นบางทีคุณ "ดาว" ที่นำเข้ามาjava.io.*และพยายามที่จะใช้แล้วFilesระดับ ... ซึ่งอยู่ในไม่ได้java.nio java.ioหรือบางทีคุณตั้งใจจะเขียนFile... ซึ่งเป็นชั้นเรียนในjava.io.


นี่คือตัวอย่างของการกำหนดขอบเขตตัวแปรที่ไม่ถูกต้องอาจทำให้เกิดข้อผิดพลาด "ไม่พบสัญลักษณ์" ได้อย่างไร:

List<String> strings = ...

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

สิ่งนี้จะทำให้เกิดข้อผิดพลาด "ไม่พบสัญลักษณ์" สำหรับiในifคำสั่ง แม้ว่าเราจะประกาศไปก่อนหน้านี้iแต่การประกาศนั้นอยู่ในขอบเขตของforคำแถลงและเนื้อหาเท่านั้น การอ้างอิงถึงiในifคำสั่งไม่สามารถมองเห็นการประกาศของi. มันเป็นออกจากขอบเขต

(การแก้ไขที่เหมาะสมในที่นี้อาจเป็นการย้ายifคำสั่งภายในลูปหรือประกาศiก่อนเริ่มลูป)


นี่คือตัวอย่างที่ทำให้เกิดการไขปริศนาซึ่งการพิมพ์ผิดนำไปสู่ข้อผิดพลาด "ไม่พบสัญลักษณ์" ที่ดูเหมือนอธิบายไม่ได้:

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

สิ่งนี้จะทำให้คุณมีข้อผิดพลาดในการคอมไพล์ในการprintlnโทรที่แจ้งว่าiไม่พบ แต่ (ฉันได้ยินคุณพูด) ฉันประกาศแล้ว!

ปัญหาคือเครื่องหมายอัฒภาค ( ;) ลับๆก่อนหน้าไฟล์{. ไวยากรณ์ภาษา Java กำหนดอัฒภาคในบริบทที่จะเป็นคำสั่งที่ว่างเปล่า คำสั่งว่างจะกลายเป็นเนื้อความของforลูป ดังนั้นรหัสนั้นจึงหมายถึงสิ่งนี้:

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

// The previous and following are separate statements!!

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

{ ... }บล็อกไม่ได้ร่างกายของforวงและดังนั้นจึงประกาศก่อนหน้านี้iในforคำสั่งออกจากขอบเขตในบล็อก


นี่คืออีกตัวอย่างหนึ่งของข้อผิดพลาด "ไม่พบสัญลักษณ์" ที่เกิดจากการพิมพ์ผิด

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

แม้จะมีการประกาศก่อนหน้านี้ แต่tmpในtmp(...)นิพจน์นั้นผิดพลาด คอมไพเลอร์จะมองหาเมธอดที่เรียกtmpแต่ไม่พบวิธีการใด ๆ ประกาศก่อนหน้านี้tmpอยู่ในเนมสเปซสำหรับตัวแปรไม่ใช่เนมสเปซสำหรับเมธอด

ในตัวอย่างที่ฉันเจอโปรแกรมเมอร์ได้ละทิ้งตัวดำเนินการไปแล้ว สิ่งที่เขาตั้งใจจะเขียนคือ:

int res = tmp * (a + b);

มีอีกสาเหตุหนึ่งที่คอมไพลเลอร์อาจไม่พบสัญลักษณ์หากคุณกำลังคอมไพล์จากบรรทัดรับคำสั่ง คุณอาจลืมที่จะคอมไพล์หรือคอมไพล์คลาสอื่น ๆ ใหม่ ตัวอย่างเช่นถ้าคุณมีชั้นเรียนFooและBarที่ใช้Foo Barหากคุณไม่เคยคอมไพล์Barและรันjavac Foo.javaคุณอาจพบว่าคอมไพลเลอร์ไม่พบสัญลักษณ์Barดังกล่าว คำตอบง่ายๆคือการรวบรวมFooและBarร่วมกัน เช่นjavac Foo.java Bar.javaหรือjavac *.java. หรือดีกว่ายังคงใช้เครื่องมือสร้าง Java เช่น Ant, Maven, Gradle เป็นต้น

มีสาเหตุที่คลุมเครืออื่น ๆ เช่นกัน ... ซึ่งฉันจะจัดการกับด้านล่าง

3. ฉันจะแก้ไขข้อผิดพลาดเหล่านี้ได้อย่างไร?

โดยทั่วไปคุณเริ่มต้นด้วยการหาสาเหตุที่ทำให้เกิดข้อผิดพลาดในการคอมไพล์

  • ดูบรรทัดในไฟล์ที่ระบุโดยข้อความแสดงข้อผิดพลาดในการคอมไพล์
  • ระบุสัญลักษณ์ที่ข้อความแสดงข้อผิดพลาดกำลังพูดถึง
  • หาสาเหตุที่คอมไพเลอร์บอกว่าไม่พบสัญลักษณ์ ดูด้านบน!

จากนั้นคุณลองคิดดูว่าโค้ดของคุณควรจะพูดอะไร จากนั้นในที่สุดคุณก็หาว่าคุณต้องแก้ไขซอร์สโค้ดของคุณเพื่อทำสิ่งที่คุณต้องการ

โปรดทราบว่าไม่ใช่ทุก "การแก้ไข" ที่ถูกต้อง พิจารณาสิ่งนี้:

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

สมมติว่าคอมไพเลอร์กล่าวว่า "คุณไม่พบสัญลักษณ์" jสำหรับ มีหลายวิธีที่ฉันสามารถ "แก้ไข" ได้:

  • ฉันสามารถเปลี่ยนด้านในforเป็นfor (int j = 1; j < 10; j++)- อาจจะถูกต้อง
  • ฉันสามารถเพิ่มการประกาศสำหรับj ก่อนภายในforห่วงหรือนอกforวง - อาจจะถูกต้อง
  • ผมอาจมีการเปลี่ยนแปลงjไปiในด้านforห่วง - อาจผิด!
  • และอื่น ๆ

ประเด็นคือคุณต้องเข้าใจว่าโค้ดของคุณกำลังพยายามทำอะไรเพื่อที่จะหาวิธีแก้ไขที่ถูกต้อง

4. ปิดบังสาเหตุ

ต่อไปนี้เป็นสองกรณีที่ดูเหมือนว่า "ไม่พบสัญลักษณ์" จะอธิบายไม่ได้ ... จนกว่าคุณจะเข้าไปดูใกล้ ๆ

  1. การอ้างอิงไม่ถูกต้อง : หากคุณกำลังใช้ IDE หรือเครื่องมือสร้างที่จัดการเส้นทางการสร้างและการอ้างอิงโครงการคุณอาจทำผิดพลาดกับการอ้างอิง เช่นละทิ้งการพึ่งพาหรือเลือกเวอร์ชันผิด หากคุณใช้เครื่องมือสร้าง (Ant, Maven, Gradle ฯลฯ ) ให้ตรวจสอบไฟล์สร้างของโครงการ หากคุณใช้ IDE ให้ตรวจสอบคอนฟิกูเรชันบิลด์พา ธ ของโปรเจ็กต์

  2. คุณไม่ได้ทำการคอมไพล์ใหม่ : บางครั้งอาจเกิดขึ้นที่โปรแกรมเมอร์ Java ใหม่ไม่เข้าใจวิธีการทำงานของห่วงโซ่เครื่องมือ Java หรือไม่ได้ใช้ "กระบวนการสร้าง" ที่ทำซ้ำได้ เช่นการใช้ IDE, Ant, Maven, Gradle เป็นต้น ในสถานการณ์เช่นโปรแกรมเมอร์ที่สามารถจบลงไล่หางของเขามองหาข้อผิดพลาดที่ไม่จริงที่เป็นจริงที่เกิดจากการไม่ recompiling รหัสได้อย่างถูกต้องและไม่ชอบ ...

  3. ปัญหาการสร้างก่อนหน้านี้ : เป็นไปได้ว่าการสร้างก่อนหน้านี้ล้มเหลวในลักษณะที่ให้ไฟล์ JAR ที่ไม่มีคลาส โดยทั่วไปความล้มเหลวดังกล่าวจะสังเกตเห็นได้หากคุณใช้เครื่องมือสร้าง อย่างไรก็ตามหากคุณได้รับไฟล์ JAR จากคนอื่นคุณจะต้องพึ่งพาไฟล์เหล่านั้นในการสร้างอย่างถูกต้องและสังเกตเห็นข้อผิดพลาด หากคุณสงสัยสิ่งนี้ให้ใช้tar -tvfเพื่อแสดงรายการเนื้อหาของไฟล์ JAR ที่ต้องสงสัย

  4. ปัญหา IDE : ผู้คนรายงานกรณีที่ IDE ของพวกเขาสับสนและคอมไพเลอร์ใน IDE ไม่พบคลาสที่มีอยู่ ... หรือสถานการณ์ย้อนกลับ

  • กรณีนี้อาจเกิดขึ้นได้หากกำหนดค่า IDE ด้วยเวอร์ชัน JDK ที่ไม่ถูกต้อง

  • สิ่งนี้อาจเกิดขึ้นได้หากแคชของ IDE ไม่ซิงค์กับระบบไฟล์ มีวิธีเฉพาะของ IDE ในการแก้ไขปัญหานั้น

  • นี่อาจเป็นข้อบกพร่องของ IDE ตัวอย่างเช่น @Joel Costigliola อธิบายสถานการณ์ที่ Eclipse ไม่จัดการกับ Maven "test" tree อย่างถูกต้อง: ดูคำตอบนี้

  1. ประเด็น Android : เมื่อคุณเขียนโปรแกรมสำหรับ Android และคุณมี "ไม่สามารถหาสัญลักษณ์" ข้อผิดพลาดที่เกี่ยวข้องกับการRจะทราบว่าRสัญลักษณ์ถูกกำหนดโดยcontext.xmlไฟล์ ตรวจสอบว่าcontext.xmlไฟล์ของคุณถูกต้องและอยู่ในตำแหน่งที่ถูกต้องและRมีการสร้าง / รวบรวมไฟล์คลาสที่เกี่ยวข้อง โปรดทราบว่าสัญลักษณ์ Java นั้นคำนึงถึงตัวพิมพ์เล็กและใหญ่ดังนั้นรหัส XML ที่เกี่ยวข้องจึงต้องคำนึงถึงขนาดตัวพิมพ์ด้วย

    ข้อผิดพลาดของสัญลักษณ์อื่น ๆ บน Android น่าจะมาจากสาเหตุที่กล่าวไว้ก่อนหน้านี้ เช่นการอ้างอิงที่ขาดหายไปหรือไม่ถูกต้องชื่อแพ็กเกจที่ไม่ถูกต้องวิธีการหรือฟิลด์ที่ไม่มีอยู่ในเวอร์ชัน API เฉพาะข้อผิดพลาดในการสะกด / การพิมพ์เป็นต้น

  2. การกำหนดคลาสระบบใหม่ : ฉันเคยเห็นกรณีที่คอมไพเลอร์บ่นว่าsubstringเป็นสัญลักษณ์ที่ไม่รู้จักในสิ่งต่อไปนี้

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

    ปรากฎว่าโปรแกรมเมอร์ได้สร้างเวอร์ชันของตัวเองStringและเวอร์ชันของคลาสของเขาไม่ได้กำหนดsubstringวิธีการ

    บทเรียน: อย่ากำหนดชั้นเรียนของคุณเองด้วยชื่อเดียวกับคลาสห้องสมุดทั่วไป!

  3. Homoglyphs: หากคุณใช้การเข้ารหัส UTF-8 สำหรับไฟล์ต้นฉบับของคุณเป็นไปได้ที่จะมีตัวระบุที่มีลักษณะเหมือนกัน แต่ในความเป็นจริงแล้วแตกต่างกันเนื่องจากมี homoglyphs ดูหน้านี้สำหรับข้อมูลเพิ่มเติม

    คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดย จำกัด ตัวเองเป็น ASCII หรือ Latin-1 เป็นการเข้ารหัสไฟล์ต้นฉบับและใช้ Java \uxxxxEscape สำหรับอักขระอื่น ๆ


1 - ถ้าบางทีคุณไม่เห็นนี้ในข้อยกเว้นรันไทม์หรือข้อผิดพลาดแล้วทั้งคุณได้กำหนดค่า IDE ของคุณเพื่อเรียกใช้รหัสมีข้อผิดพลาดการรวบรวมหรือใบสมัครของคุณคือการสร้างและรวบรวมรหัส .. ที่รันไทม์

2 - หลักการพื้นฐานสามประการของวิศวกรรมโยธา: น้ำไม่ไหลขึ้นเนินไม้กระดานจะแข็งแรงกว่าที่ด้านข้างและคุณไม่สามารถดันเชือกได้

26 thinkterry Apr 17 2015 at 15:50

คุณจะได้รับข้อผิดพลาดนี้หากคุณลืมnew:

String s = String();

เทียบกับ

String s = new String();

เนื่องจากการเรียกที่ไม่มีnewคีย์เวิร์ดจะพยายามและมองหาเมธอด (ในระบบ) ที่เรียกStringโดยไม่มีอาร์กิวเมนต์ - และลายเซ็นของเมธอดนั้นไม่ได้กำหนดไว้

14 Jan Dec 06 2015 at 16:19

อีกหนึ่งตัวอย่างของ 'ตัวแปรอยู่นอกขอบเขต'

อย่างที่ฉันเคยเห็นคำถามแบบนั้นมาสองสามครั้งแล้วอาจจะเป็นอีกตัวอย่างหนึ่งของสิ่งที่ผิดกฎหมายแม้ว่ามันจะรู้สึกโอเคก็ตาม

พิจารณารหัสนี้:

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

รหัสไม่ถูกต้อง เนื่องจากตัวแปรที่ตั้งชื่อmessageไม่สามารถมองเห็นได้นอกขอบเขตตามลำดับซึ่งจะเป็นวงเล็บโดยรอบ{}ในกรณีนี้

คุณอาจพูดว่า: "แต่มีการกำหนดตัวแปรชื่อข้อความไม่ว่าจะด้วยวิธีใดก็ตามดังนั้นข้อความจึงถูกกำหนดไว้หลังif"

แต่คุณคิดผิด

Java ไม่มีfree()หรือdeleteตัวดำเนินการดังนั้นจึงต้องพึ่งพาขอบเขตตัวแปรการติดตามเพื่อค้นหาว่าเมื่อใดที่ไม่ได้ใช้ตัวแปรอีกต่อไป (พร้อมกับการอ้างอิงถึงตัวแปรสาเหตุเหล่านี้)

โดยเฉพาะอย่างยิ่งถ้าคุณคิดว่าคุณได้ทำสิ่งที่ดี ฉันเห็นข้อผิดพลาดประเภทนี้หลังจากโค้ด "เพิ่มประสิทธิภาพ" ดังนี้:

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

"โอ้มีรหัสที่ซ้ำกันลองดึงบรรทัดร่วมนั้นออกมา" -> และตรงนั้น

วิธีที่ใช้บ่อยที่สุดในการจัดการกับปัญหาขอบเขตประเภทนี้คือการกำหนดค่าอื่นล่วงหน้าให้กับชื่อตัวแปรในขอบเขตภายนอกจากนั้นกำหนดใหม่ใน if:

String message = "We have an error";
if(somethingIsTrue()) {
  message = "Everything is fine";
} 
System.out.println(message);
10 JoelCostigliola May 13 2016 at 17:09

วิธีหนึ่งในการรับข้อผิดพลาดนี้ใน Eclipse:

  1. กำหนดคลาสAในsrc/test/java.
  2. กำหนดอีกชั้นBในที่ใช้ในชั้นเรียนsrc/main/javaA

ผลลัพธ์: Eclipse จะคอมไพล์โค้ด แต่ maven จะให้ "ไม่พบสัญลักษณ์"

สาเหตุที่สำคัญ: Eclipse ใช้พา ธ การสร้างแบบรวมสำหรับต้นไม้หลักและทดสอบ น่าเสียดายที่ไม่สนับสนุนการใช้เส้นทางการสร้างที่แตกต่างกันสำหรับส่วนต่างๆของโครงการ Eclipse ซึ่งเป็นสิ่งที่ Maven ต้องการ

วิธีการแก้ :

  1. อย่ากำหนดการอ้างอิงของคุณด้วยวิธีนั้น คืออย่าทำผิดพลาดนี้
  2. สร้าง codebase ของคุณโดยใช้ Maven เป็นประจำเพื่อที่คุณจะได้รับข้อผิดพลาดนี้ แต่เนิ่นๆ วิธีหนึ่งที่ทำได้คือใช้เซิร์ฟเวอร์ CI
5 GT_hash Jun 30 2018 at 18:09

"ไม่พบ" หมายความว่าคอมไพเลอร์ที่ไม่พบตัวแปรที่เหมาะสมวิธีการคลาส ฯลฯ ... หากคุณได้รับการนวดผิดพลาดก่อนอื่นคุณต้องค้นหาโค้ดไลน์ที่ได้รับการนวดผิดพลาด .. แล้วคุณจะ สามารถค้นหาตัวแปรวิธีการหรือคลาสที่ยังไม่ได้กำหนดก่อนที่จะใช้หลังจากการยืนยันเริ่มต้นตัวแปรแล้ววิธีการหรือคลาสสามารถใช้เพื่อต้องการในภายหลัง ... พิจารณาตัวอย่างต่อไปนี้

ฉันจะสร้างคลาสสาธิตและพิมพ์ชื่อ ...

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

ตอนนี้ดูผล ..

ข้อผิดพลาดนั้นระบุว่า "ไม่พบชื่อตัวแปร" .. การกำหนดและกำหนดค่าเริ่มต้นสำหรับตัวแปร "ชื่อ" สามารถยกเลิกข้อผิดพลาดนั้นได้ .. ที่จริงเป็นเช่นนี้

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

             String name="smith";

             System.out.print(name);
      }
}

ตอนนี้ดูผลลัพธ์ใหม่ ...

ตกลงแก้ไขข้อผิดพลาดนั้นสำเร็จแล้ว .. ในขณะเดียวกันหากคุณได้รับ "ไม่พบวิธีการ" หรือ "ไม่พบคลาส" บางสิ่งในตอนแรกให้กำหนดคลาสหรือวิธีการและหลังจากใช้งานแล้ว ..

3 JonathanLin Mar 08 2016 at 12:58

หากคุณได้รับข้อผิดพลาดนี้ในบิลด์ที่อื่นในขณะที่ IDE ของคุณบอกว่าทุกอย่างเรียบร้อยดีให้ตรวจสอบว่าคุณใช้ Java เวอร์ชันเดียวกันในทั้งสองที่

ตัวอย่างเช่น Java 7 และ Java 8 มี API ที่แตกต่างกันดังนั้นการเรียก API ที่ไม่มีอยู่จริงใน Java เวอร์ชันเก่าจะทำให้เกิดข้อผิดพลาดนี้

3 Ajay Oct 10 2019 at 19:07

แก้ไขแล้ว

ใช้ IntelliJ

เลือกสร้าง -> สร้างโครงการใหม่จะแก้ปัญหาได้

2 DivyaJose Sep 28 2016 at 21:59

ฉันก็ได้รับข้อผิดพลาดนี้เช่นกัน (ซึ่งฉัน googled และถูกนำไปที่หน้านี้)

ปัญหา:ฉันกำลังเรียกใช้วิธีการแบบคงที่ที่กำหนดในคลาสของโครงการ A จากคลาสที่กำหนดไว้ในโครงการอื่น B ​​ฉันได้รับข้อผิดพลาดต่อไปนี้:

error: cannot find symbol

วิธีแก้ไข:ฉันแก้ไขสิ่งนี้โดยการสร้างโปรเจ็กต์ก่อนโดยที่เมธอดถูกกำหนดจากนั้นโปรเจ็กต์ที่เมธอดถูกเรียกใช้

2 UdayKiranPulipati Jan 24 2019 at 18:18

หาก eclipse Java build path ถูกแมปกับ 7, 8 และใน Project pom.xml Maven properties java.version ถูกกล่าวถึงเวอร์ชัน Java ที่สูงกว่า (9,10,11 ฯลฯ .. ,) มากกว่า 7,8 คุณต้องอัพเดตใน pom xml ไฟล์

ใน Eclipse หากแมป Java กับ Java เวอร์ชัน 11 และใน pom.xml จะแมปกับ Java เวอร์ชัน 8 อัปเดตการสนับสนุน Eclipse เป็น Java 11 โดยทำตามขั้นตอนด้านล่างใน eclipse IDE Help -> ติดตั้งซอฟต์แวร์ใหม่ ->

วางลิงค์ต่อไปนี้http://download.eclipse.org/eclipse/updates/4.9-P-builds at Work With

หรือ

เพิ่ม (หน้าต่างป๊อปอัปจะเปิดขึ้น) ->

Name:รองรับ Java 11 Location: http://download.eclipse.org/eclipse/updates/4.9-P-builds

จากนั้นอัปเดตเวอร์ชัน Java ในคุณสมบัติ Maven ของไฟล์pom.xmlดังต่อไปนี้

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

สุดท้ายให้คลิกขวาที่ Project Debug as -> Maven clean, Maven build steps

1 avp Aug 18 2018 at 08:45

อาจมีสถานการณ์ต่างๆตามที่ผู้คนได้กล่าวไว้ข้างต้น สองสิ่งที่ช่วยฉันแก้ไขปัญหานี้ได้

  1. หากคุณใช้ IntelliJ

    File -> 'Invalidate Caches/Restart'

หรือ

  1. คลาสที่อ้างถึงอยู่ในโปรเจ็กต์อื่นและการอ้างอิงนั้นไม่ได้ถูกเพิ่มลงในไฟล์บิวด์ Gradle ของโปรเจ็กต์ของฉัน ดังนั้นฉันจึงเพิ่มการพึ่งพาโดยใช้

    compile project(':anotherProject')

และมันได้ผล เฮ้!

1 ANILKUMAR Aug 07 2019 at 11:59

คุณคอมไพล์โค้ดของคุณโดยใช้ maven compile แล้วใช้ maven test เพื่อเรียกใช้งานได้ดี ตอนนี้ถ้าคุณเปลี่ยนบางอย่างในโค้ดของคุณแล้วโดยไม่คอมไพล์คุณกำลังเรียกใช้งานคุณจะได้รับข้อผิดพลาดนี้

วิธีแก้ไข: รวบรวมอีกครั้งจากนั้นเรียกใช้การทดสอบ สำหรับฉันมันทำงานในลักษณะนี้

1 VIPINKUMAR Sep 08 2019 at 14:50

ในกรณีของฉัน - ฉันต้องดำเนินการด้านล่าง:

  1. ย้ายcontext.xmlไฟล์จากsrc/java/packageไปยังresourceไดเร็กทอรี (IntelliJ IDE)
  2. ล้างtargetไดเรกทอรี
Striker Sep 06 2017 at 19:47

สำหรับคำแนะนำให้ดูที่ชื่อคลาสที่แสดงข้อผิดพลาดและหมายเลขบรรทัดตัวอย่างเช่นคอมไพล์ล้มเหลว [ERROR] \ applications \ xxxxx.java: [44,30] error: ไม่พบสัญลักษณ์

อีกสาเหตุหนึ่งคือวิธีที่ไม่รองรับสำหรับเวอร์ชัน java พูดว่า jdk7 vs 8 ตรวจสอบ% JAVA_HOME% ของคุณ

sakra Jul 20 2020 at 19:31

เราพบข้อผิดพลาดในโปรเจ็กต์ Java ที่ตั้งค่าเป็น Gradle multi-project build มันกลับกลายเป็นว่าหนึ่งในโครงการย่อยได้ที่ขาดหายไปปลั๊กอิน Gradle Java ห้องสมุด ซึ่งป้องกันไม่ให้ไฟล์คลาสของโปรเจ็กต์ย่อยมองเห็นโปรเจ็กต์อื่นในบิลด์

หลังจากเพิ่มปลั๊กอินไลบรารี Java ไปยังโปรเจ็กต์ย่อยbuild.gradleด้วยวิธีต่อไปนี้ข้อผิดพลาดก็หายไป:

plugins {
    ...
    id 'java-library'
}
FelipeFranco Nov 20 2020 at 04:03

ฉันแก้ไขข้อผิดพลาดแบบนี้ ... ความบ้าคลั่งของ android ฉันมีชื่อแพ็คเกจเป็นอะแดปเตอร์และฉันเปลี่ยนชื่อเป็นอะแดปเตอร์ด้วย "a" แทน "A" และแก้ไขข้อผิดพลาด