A „Nem található szimbólum” fordítási hiba

1. Áttekintés

Ebben az oktatóanyagban áttekintjük, hogy mi az összeállítási hiba, majd konkrétan elmagyarázzuk, hogy mi a „nem találom a szimbólumot” hiba, és annak oka.

2. Időhibák összeállítása

A fordítás során a fordító számos dologra elemzi és ellenőrzi a kódot; referenciatípusok, típusgondolások és metódusdeklarációk, hogy néhányat említsünk. A fordítási folyamat ezen része fontos, mivel ebben a szakaszban fordítási hibát kapunk.

Alapvetően három fordítási időbeli hiba létezik:

  • Szintaxis hibáink lehetnek. Az egyik leggyakoribb hiba, amelyet bármely programozó elkövethet, ha elfelejtette a pontosvesszőt a kijelentés végére tenni; mások elfelejtik az importálást, a zárójelek eltérését vagy elutasítják a return utasítást
  • Ezután vannaktípusellenőrzési hibák. Ez a kódbiztonság ellenőrzésének folyamata. Ezzel az ellenőrzéssel meggyőződünk arról, hogy egységes típusú kifejezésekkel rendelkezünk. Például, ha definiálunk egy típusú változót int, soha nem szabad a kettős vagy Húr érték hozzá
  • Eközben fennáll annak a lehetősége, hogy a fordító összeomlik. Ez nagyon ritka, de előfordulhat. Ebben az esetben jó tudni, hogy a kódunk nem okozhat problémát, de inkább külső probléma

3. A „szimbólum nem található” hiba

A „nem találom a szimbólumot” hiba főleg akkor jelenik meg, amikor olyan változót próbálunk használni, amelyet a programunk nem definiált vagy deklarált.

A kód fordításakor a fordítónak ellenőriznie kell az összes azonosítónkat. A hiba„Nem találok szimbólumot” azt jelenti, hogy mi vagyunkutalva valamire, amiről a fordító nem tud.

3.1. Mi okozhatja „Nem találok szimbólumot” Hiba?

Valóban, egyetlen oka van: A fordító nem találta annak a változónak a meghatározását, amelyre hivatkozni próbálunk.

De ennek számos oka van. Hogy jobban megértsük, miért, emlékeztessük magunkat arra, hogy miből áll a Java kód.

Java forráskódunk a következőkből áll:

  • Kulcsszavak: igaz, hamis, osztály, míg
  • Literálok: számok és szöveg
  • Operátorok és más nem alfanumerikus tokenek: -, /, +, =, {
  • Azonosítók: fő-, Olvasó, én, Sztringstb.
  • Megjegyzések és szóköz

4. Hibás írás

A leggyakoribb kérdések mind helyesírással kapcsolatosak. Ha emlékeztetünk arra, hogy az összes Java-azonosító megkülönbözteti a kis- és nagybetűket, láthatjuk, hogy:

  • StringBiulder
  • stringBuilder
  • String_Builder

különböző módon lehetne helytelenül hivatkozni a StringBuilder osztály.

5. Példány hatóköre

Ezt a hibát akkor is előidézheti, ha olyan dolgot használ, amelyet az osztály hatókörén kívülre deklaráltak.

Tegyük fel például, hogy van egy Cikk osztály, amely felhívja a generálId módszer:

public class Article {private int length; privát hosszú id; public Article (int hossz) {this.hossz = hossz; this.id = generálId (); }}

De kijelentjük a generálId módszer külön osztályban:

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

Ezzel a beállítással a fordító „nem talál szimbólumot” hibát ad a következőre: generálId a. vonal 7 Cikk töredék. Ennek oka, hogy a 7. sor szintaxisa azt sugallja, hogy a generálId módszer deklarálva van Cikk.

Mint minden érett nyelven, itt is többféleképpen lehet kezelni ezt a problémát. De az egyik módja a konstrukció lenne IdGenerator ban,-ben Cikk osztály, majd hívja meg a módszert:

public class Article {private int length; privát hosszú id; public Article (int hossz) {this.hossz = hossz; this.id = új IdGenerator (). generálId (); }}

6. Meghatározatlan változók

Néha elfelejtjük deklarálni a változót. Amint az alábbi részletből láthatjuk, megpróbáljuk manipulálni azt a változót, amelyet nem deklaráltunk, ebben az esetben: szöveg:

public class Article {private int length; // ... public void setText (String newText) {this.text = newText; // a szöveges változót soha nem definiálták}}

Ezt a problémát a változó deklarálásával oldjuk meg szöveg típusú Húr:

public class Article {private int length; privát karakterlánc szöveg; // ... public void setText (String newText) {this.text = newText; }}

7. Változó hatókör

Ha egy változó deklarációja azon a ponton kívül esik, ahol megpróbáltuk használni, akkor hibát okoz a fordítás során. Ez általában akkor történik, ha hurokkal dolgozunk.

A cikluson belüli változók nem érhetők el a cikluson kívül:

public boolean findLetterB (String text) {for (int i = 0; i <text.length (); i ++) {Karakter karakter = text.charAt (i); if (String.valueOf (karakter) .egyenlő ("b")) {return true; } return false; } if (karakter == "a") {// <- hiba! ...}}

A ha utasításnak be kell mennie a hurokhoz ha jobban meg kell vizsgálnunk a karaktereket:

public boolean findLetterB (String text) {for (int i = 0; i <text.length (); i ++) {Karakter karakter = text.charAt (i); if (String.valueOf (karakter) .egyenlő ("b")) {return true; } else if (String.valueOf (karakter) .egyenlő ("a")) {...} false értéket ad vissza; }}

8. A módszerek vagy mezők érvénytelen használata

A „szimbólumot nem találom” hiba akkor is előfordul, ha egy mezőt használunk módszerként, vagy fordítva:

public class Article {private int length; privát hosszú id; privát lista szövegek; public Article (int hossz) {this.hossz = hossz; } // szerelők és beállítók}

Most, ha megpróbálunk hivatkozni a cikkre szövegeket mező, mintha egy módszer lenne:

Cikkcikk = új cikk (300); Listaszövegek = cikk.szövegek ();

akkor látnánk a hibát.

Ez azért van, mert a fordító egy ún szövegeket, amiről nincs egy.

Valójában van egy getter módszer, amelyet helyette használhatunk:

Cikkcikk = új cikk (300); Listaszövegek = article.getTexts ();

Szintén egy tömb tévesen történő működtetése, nem pedig egy tömb elem:

for (Karaktersorozat szövege: szövegek) {String firstLetter = text.charAt (0); // legyen text.charAt (0)}

És így elfelejteni a új kulcsszó, mint:

Karakterlánc s = Karakterlánc (); // legyen "új karakterlánc ()"

9. Csomag- és osztályimport

Egy másik probléma az osztály vagy csomag importálásának elfelejtése. Például a Lista objektum importálás nélkül java.util.List:

// hiányzó import kimutatás: // import java.util.List public class Article {private int length; privát hosszú id; privát lista szövegek; <- hiba! public Article (int hossz) {this.hossz = hossz; }}

Ez a kód nem fordítható le, mivel a program nem tudja, mit Lista van.

10. Helytelen behozatal

Rossz típus importálása az IDE befejezése vagy az automatikus javítás miatt szintén gyakori probléma.

Gondoljon arra a helyzetre, amikor a dátumokat Java-ban akarjuk használni. Sokszor hibát importálhatunk Dátum osztály, amely nem nyújt módszereket és funkciókat, mint más dátumosztályok, amelyekre szükségünk lehet:

Dátum dátum = új dátum (); int év, hónap, nap;

Az év, hónap vagy nap megszerzéséhez java.util.Dátum, importálnunk is kell Naptár osztályba, és onnan nyerje ki az információkat.

Egyszerűen hivatkozva getDate () tól től java.util.Dátum nem fog működni:

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

Ehelyett a Naptár tárgy:

... Naptár cal = Calendar.getInstance (TimeZone.getTimeZone ("Európa / Párizs")); cal.setTime (dátum); év = cal.get (Naptár.ÉV); hónap = cal.get (Naptár.HÓNAP); nap = cal.get (Naptár.DAY_OF_MONTH);

Ha azonban importáltuk a LocalDate osztályban nincs szükségünk további kódra, amely megadja a szükséges információkat:

... LocalDate localDate = date.toInstant (). AtZone (ZoneId.systemDefault ()). ToLocalDate (); év = localDate.getYear (); hónap = localDate.getMonthValue (); nap = localDate.getDayOfMonth ();

11. Következtetés

A fordítók rögzített, nyelvspecifikus szabályok alapján dolgoznak. Ha egy kód nem tartja be ezeket a szabályokat, a fordító nem hajthat végre átalakítási folyamatot, amely fordítási hibát eredményez. Amikor a „Nem található szimbólum” fordítási hibával szembesülünk, a legfontosabb az ok azonosítása.

A hibaüzenetből megtalálhatjuk azt a kódsort, ahol a hiba bekövetkezik, és melyik elem hibás. A hibát okozó leggyakoribb problémák ismerete nagyon egyszerűvé és gyorsabbá teszi a megoldást.