Chyba kompilácie „Symbol nemožno nájsť“

1. Prehľad

V tomto tutoriáli sa pozrieme na to, čo sú chyby kompilácie, a potom konkrétne vysvetlíme, čo je chyba „symbol nenájdený“ a ako je spôsobená.

2. Zostavte chyby času

Počas kompilácie kompilátor analyzuje a overuje kód na množstvo vecí; referenčné typy, obsadenie typov a vyhlásenia metód, aby sme vymenovali aspoň niektoré. Táto časť procesu kompilácie je dôležitá, pretože počas tejto fázy sa zobrazí chyba kompilácie.

V zásade existujú tri typy chýb pri kompilácii:

  • Môžeme mať syntaktické chyby. Jednou z najčastejších chýb, ktoré môže každý programátor urobiť, je zabudnutie vložiť bodkočiarku na koniec príkazu; niektorí iní zabúdajú na import, nesúhlasia so zátvorkami alebo vynechávajú príkaz na vrátenie
  • Ďalej existujúchyby pri kontrole typu. Toto je proces overovania bezpečnosti typu v našom kóde. Touto kontrolou sa ubezpečujeme, že máme konzistentné typy výrazov. Napríklad, ak definujeme premennú typu int, nikdy by sme nemali priradiť a dvojitý alebo String hodnotu
  • Zatiaľ existuje možnosť, že kompilátor zlyhá. Je to veľmi zriedkavé, ale môže sa to stať. V tomto prípade je dobré vedieť, že náš kód nemusí byť problémom, ale je to skôr externý problém

3. Chyba „symbol nenájdený“

Chyba „nenájdem symbol“ sa objaví hlavne vtedy, keď sa pokúsime použiť premennú, ktorá nie je v našom programe definovaná alebo deklarovaná.

Pri kompilácii nášho kódu musí kompilátor overiť všetky identifikátory, ktoré máme. Chyba„Nenájdem symbol“ znamená, že smeodkaz na niečo, o čom kompilátor nevie.

3.1. Čo môže spôsobiť „Nenájdem symbol“ Chyba?

Naozaj existuje iba jedna príčina: Kompilátor nemohol nájsť definíciu premennej, na ktorú sa snažíme odkazovať.

Existuje však veľa dôvodov. Aby sme lepšie pochopili prečo, pripomeňme si, z čoho pozostáva kód Java.

Náš zdrojový kód Java pozostáva z:

  • Kľúčové slová: true, false, class, while
  • Literály: čísla a text
  • Prevádzkovatelia a iné nealfanumerické tokeny: -, /, +, =, {
  • Identifikátory: hlavný, Čitateľ, i, natiahnuť, atď.
  • Komentáre a medzery

4. Pravopisná chyba

Najbežnejšie problémy súvisia s pravopisom. Ak si spomenieme, že všetky identifikátory Java rozlišujú veľké a malé písmená, môžeme vidieť, že:

  • StringBiulder
  • stringBuilder
  • String_Builder

by boli rôzne spôsoby, ako nesprávne odkazovať na StringBuilder trieda.

5. Rozsah inštancie

Túto chybu môže spôsobiť aj použitie niečoho, čo bolo deklarované mimo rozsahu triedy.

Povedzme napríklad, že máme Článok trieda, ktorá volá a generateId metóda:

public class Article {private int length; súkromné ​​dlhé ID; public Article (int dĺžka) {this.length = dĺžka; this.id = generateId (); }}

Ale, vyhlasujeme generateId metóda v samostatnej triede:

public class IdGenerator {public long generateId () {Random random = new Random (); return random.nextInt (); }}

S týmto nastavením kompilátor zobrazí chybu „symbol nenájdený“ generateId na riadku 7 Článok úryvok. Dôvod je ten, že syntax riadku 7 znamená, že: generateId metóda je deklarovaná v Článok.

Rovnako ako vo všetkých vyspelých jazykoch, existuje viac ako jeden spôsob riešenia tohto problému. Jedným zo spôsobov by však bola konštrukcia IdGenerator v Článok triedy a potom zavolajte metódu:

public class Article {private int length; súkromné ​​dlhé ID; public Article (int dĺžka) {this.length = dĺžka; this.id = new IdGenerator (). generateId (); }}

6. Nedefinované premenné

Niekedy zabudneme deklarovať premennú. Ako vidíme z útržku nižšie, snažíme sa manipulovať s premennou, ktorú sme nedeklarovali, v tomto prípade text:

public class Article {private int length; // ... public void setText (String newText) {this.text = newText; // textová premenná nikdy nebola definovaná}}

Tento problém riešime deklarovaním premennej text typu String:

public class Article {private int length; súkromný textový reťazec; // ... public void setText (String newText) {this.text = newText; }}

7. Variabilný rozsah pôsobnosti

Keď je deklarácia premennej mimo rozsahu v okamihu, keď sme sa ju pokúsili použiť, spôsobí to chybu počas kompilácie. To sa zvyčajne stáva, keď pracujeme so slučkami.

Premenné vo vnútri slučky nie sú prístupné mimo slučky:

public boolean findLetterB (String text) {for (int i = 0; i <text.length (); i ++) {Character character = text.charAt (i); if (String.valueOf (znak) .equals ("b")) {return true; } return false; } if (znak == "a") {// <- chyba! ...}}

The ak vyhlásenie by malo ísť dovnútra pre slučku ak potrebujeme viac preskúmať znaky:

public boolean findLetterB (String text) {for (int i = 0; i <text.length (); i ++) {Character character = text.charAt (i); if (String.valueOf (znak) .equals ("b")) {return true; } else if (String.valueOf (znak) .equals ("a")) {...} return false; }}

8. Neplatné použitie metód alebo polí

Chyba „symbol nenájdený“ sa vyskytne aj vtedy, ak ako metódu použijeme pole alebo naopak:

public class Article {private int length; súkromné ​​dlhé ID; súkromné ​​zoznamové texty; public Article (int dĺžka) {this.length = dĺžka; } // zakladatelia a zakladatelia}

Teraz, keď sa pokúsime odvolať na tento článok textov pole akoby to bola metóda:

Article article = nový článok (300); Zoznam textov = article.texts ();

potom by sme videli chybu.

Je to preto, že kompilátor hľadá metódu s názvom textov, ktorý tam nie je ani jeden.

V skutočnosti existuje getter metóda, ktorú môžeme použiť namiesto toho:

Article article = nový článok (300); Zoznam textov = article.getTexts ();

Problémom je tiež chybná prevádzka na poli, a nie na prvku poľa:

pre (Reťazcový text: texty) {String firstLetter = texty.charAt (0); // mal by to byť text.charAt (0)}

A tak sa zabúda na Nový kľúčové slovo ako v:

Reťazec s = Reťazec (); // by mal byť „nový reťazec ()“

9. Dovoz balíkov a tried

Ďalším problémom je zabudnutie na import triedy alebo balíka. Napríklad pomocou a Zoznam objekt bez importu java.util.List:

// chýba vyhlásenie o dovoze: // import java.util.List public class Article {private int length; súkromné ​​dlhé ID; súkromné ​​zoznamové texty; <- chyba! public Article (int dĺžka) {this.length = dĺžka; }}

Tento kód by sa nezostavil, pretože program nevie čo Zoznam je.

10. Nesprávny dovoz

Častým problémom je aj import nesprávneho typu z dôvodu dokončenia IDE alebo automatickej opravy.

Pomysli na situáciu, keď chceme v Jave použiť dátumy. Mnohokrát sme mohli importovať nesprávne Dátum trieda, ktorá neposkytuje metódy a funkcie ako iné datové triedy, ktoré by sme mohli potrebovať:

Dátum dátum = nový Dátum (); int rok, mesiac, deň;

Ak chcete získať rok, mesiac alebo deň pre java.util.Date, tiež musíme dovážať Kalendár triedy a odtiaľ extrahovať informácie.

Jednoducho vyvolanie getDate () od java.util.Date nebude fungovať:

... date.getDay (); date.getMonth (); date.getYear ();

Namiesto toho používame Kalendár objekt:

... Calendar cal = Calendar.getInstance (TimeZone.getTimeZone ("Europe / Paris")); cal.setTime (dátum); rok = cal.get (Calendar.YEAR); mesiac = cal.get (Calendar.MONTH); deň = cal.get (Calendar.DAY_OF_MONTH);

Ak sme však importovali LocalDate triedy, nepotrebovali by sme ďalší kód, ktorý by nám poskytol potrebné informácie:

... LocalDate localDate = date.toInstant (). AtZone (ZoneId.systemDefault ()). ToLocalDate (); year = localDate.getYear (); mesiac = localDate.getMonthValue (); deň = localDate.getDayOfMonth ();

11. Záver

Prekladače pracujú na pevnej skupine pravidiel, ktoré sú špecifické pre jednotlivé jazyky. Ak sa kód nedrží týchto pravidiel, kompilátor nemôže vykonať proces prevodu, ktorý by mal za následok chybu kompilácie. Keď sa stretneme s chybou kompilácie „Symbol nemožno nájsť“, kľúčom je identifikovať príčinu.

Z chybového hlásenia nájdeme riadok kódu, kde sa chyba vyskytuje a ktorý prvok je nesprávny. Ak poznáte najbežnejšie problémy, ktoré spôsobujú túto chybu, bude jej riešenie veľmi ľahké a rýchle.


$config[zx-auto] not found$config[zx-overlay] not found