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.