Kompileringsfeilen “Kan ikke finne symbolet”

1. Oversikt

I denne opplæringen vil vi gjennomgå hva kompileringsfeil er, og deretter spesifikt forklare hva feilen "ikke finner symbol" er og hvordan den er forårsaket.

2. Kompilere tidsfeil

Under kompilering analyserer og verifiserer kompilatoren koden for mange ting; referansetyper, typekast og metodedeklarasjoner for å nevne noen. Denne delen av kompileringsprosessen er viktig siden vi i løpet av denne fasen får en kompileringsfeil.

I utgangspunktet er det tre typer kompileringsfeil:

  • Vi kan ha syntaksfeil. En av de vanligste feilene enhver programmerer kan gjøre er å glemme å sette semikolonet på slutten av uttalelsen. noen andre glemmer import, samsvarer ikke parenteser eller utelater returoppgaven
  • Neste er dettypekontrollfeil. Dette er en prosess for å verifisere typesikkerhet i koden vår. Med denne sjekken sørger vi for at vi har konsistente typer uttrykk. For eksempel hvis vi definerer en variabel av typen int, vi skal aldri tildele en dobbelt eller String verdi for det
  • I mellomtiden er det en mulighet for at kompilatoren krasjer. Dette er veldig sjeldent, men det kan skje. I dette tilfellet er det godt å vite at koden vår ikke kan være et problem, men at det heller er et eksternt problem

3. Feilen “finner ikke symbolet”

Feilen "kan ikke finne symbol" kommer opp hovedsakelig når vi prøver å bruke en variabel som ikke er definert eller deklarert i vårt program.

Når koden kompileres, må kompilatoren verifisere alle identifikatorene vi har. Feilen"Finner ikke symbol" betyr at vi ermed henvisning til noe som kompilatoren ikke vet om.

3.1. Hva kan forårsake "kan ikke finne symbol" Feil?

Egentlig er det bare en årsak: Kompilatoren fant ikke definisjonen på en variabel vi prøver å referere til.

Men det er mange grunner til at dette skjer. For å hjelpe oss med å forstå hvorfor, la oss minne oss selv om hva Java-kode består av.

Java-kildekoden vår består av:

  • Nøkkelord: sant, usant, klasse, mens
  • Bokstaver: tall og tekst
  • Operatører og andre ikke-alfanumeriske tokens: -, /, +, =, {
  • Identifikatorer: hoved-, Leser, Jeg, toString, etc.
  • Kommentarer og mellomrom

4. Feilstaving

De vanligste problemene er alle staverelaterte. Hvis vi husker at alle Java-identifikatorer er store og små bokstaver, kan vi se at:

  • StringBiulder
  • stringBuilder
  • String_Builder

ville alle være forskjellige måter å feilaktig henvise til StringBuilder klasse.

5. Instansens omfang

Denne feilen kan også oppstå når du bruker noe som ble erklært utenfor klassen.

La oss for eksempel si at vi har en Artikkel klasse som kaller en generereId metode:

public class Article {private int lengde; privat lang id; offentlig artikkel (int-lengde) {this.length = lengde; this.id = generereId (); }}

Men vi erklærer generereId metode i en egen klasse:

offentlig klasse IdGenerator {offentlig lang generereId () {Tilfeldig tilfeldig = ny tilfeldig (); return random.nextInt (); }}

Med dette oppsettet vil kompilatoren gi en “kan ikke finne symbol” feil for generereId på linje 7 i Artikkel utdrag. Årsaken er at syntaksen til linje 7 innebærer at generereId metoden er erklært i Artikkel.

Som på alle modne språk, er det mer enn én måte å løse dette problemet på. Men en måte ville være å konstruere IdGenerator i Artikkel klasse og ring deretter metoden:

public class Article {private int lengde; privat lang id; offentlig artikkel (int-lengde) {this.length = lengde; this.id = ny IdGenerator (). generereId (); }}

6. Udefinerte variabler

Noen ganger glemmer vi å erklære variabelen. Som vi kan se fra utdraget nedenfor, prøver vi å manipulere variabelen vi ikke har deklarert, i dette tilfellet, tekst:

public class Article {private int lengde; // ... public void setText (String newText) {this.text = newText; // tekstvariabel ble aldri definert}}

Vi løser dette problemet ved å erklære variabelen tekst av typen String:

public class Article {private int lengde; privat strengtekst; // ... public void setText (String newText) {this.text = newText; }}

7. Variabelt omfang

Når en variabelerklæring er utenfor omfanget på det tidspunktet vi prøvde å bruke den, vil det forårsake en feil under kompilering. Dette skjer vanligvis når vi jobber med løkker.

Variabler inne i sløyfen er ikke tilgjengelige utenfor sløyfen:

offentlig boolsk findLetterB (strengtekst) {for (int i = 0; i <text.length (); i ++) {Character character = text.charAt (i); if (String.valueOf (character) .equals ("b")) {return true; } returner falsk; } hvis (tegn == "a") {// <- feil! ...}}

De hvis uttalelse skal gå inn i for løkke hvis vi trenger å undersøke tegn mer:

offentlig boolsk findLetterB (strengtekst) {for (int i = 0; i <text.length (); i ++) {Character character = text.charAt (i); if (String.valueOf (character) .equals ("b")) {return true; } annet hvis (String.valueOf (karakter) .equals ("a")) {...} returnerer false; }}

8. Ugyldig bruk av metoder eller felt

Feilen "finner ikke symbol" vil også oppstå hvis vi bruker et felt som en metode eller omvendt:

public class Article {private int lengde; privat lang id; private Listetekster; offentlig artikkel (int-lengde) {this.length = lengde; } // getters og setters}

Nå, hvis vi prøver å referere til artikkelen tekster felt som om det var en metode:

Artikkelartikkel = ny artikkel (300); Listetekster = artikkel.tekster ();

da ville vi se feilen.

Det er fordi kompilatoren leter etter en metode som heter tekster, som det ikke er en.

Egentlig er det en getter metode som vi kan bruke i stedet:

Artikkelartikkel = ny artikkel (300); Listetekster = article.getTexts ();

Feil operasjon på en matrise i stedet for et matriseelement er også et problem:

for (Stringtekst: tekster) {String firstLetter = tekster.charAt (0); // det skal være text.charAt (0)}

Og det er også å glemme ny nøkkelord som i:

Streng s = Streng (); // skal være 'ny streng ()'

9. Pakke- og klasseimport

Et annet problem er å glemme å importere klassen eller pakken. For eksempel ved å bruke en Liste objekt uten å importere java.util.Liste:

// mangler importuttalelse: // import java.util.List public class Article {private int length; privat lang id; private Listetekster; <- feil! offentlig artikkel (int-lengde) {this.length = lengde; }}

Denne koden vil ikke kompileres siden programmet ikke vet hva Liste er.

10. Feil import

Import av feil type på grunn av IDE-fullføring eller automatisk korrigering er også et vanlig problem.

Tenk på situasjonen når vi vil bruke datoer i Java. Mange ganger kunne vi importere feil Dato klasse, som ikke gir metoder og funksjoner som andre dataklasser som vi kanskje trenger:

Dato dato = ny dato (); int år, måned, dag;

For å få året, måneden eller dagen for java.util.Date, må vi også importere Kalender klasse og hente ut informasjonen derfra.

Bare påkalle getDate () fra java.util.Date vil ikke fungere:

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

I stedet bruker vi Kalender gjenstand:

... Kalender cal = Calendar.getInstance (TimeZone.getTimeZone ("Europa / Paris")); cal.setTime (dato); år = cal.get (Calendar.YEAR); måned = cal.get (Calendar.MONTH); dag = cal.get (Calendar.DAY_OF_MONTH);

Imidlertid, hvis vi har importert LocalDate klasse, trenger vi ikke tilleggskode som gir oss den informasjonen vi trenger:

... LocalDate localDate = date.toInstant (). AtZone (ZoneId.systemDefault ()). ToLocalDate (); år = localDate.getYear (); måned = localDate.getMonthValue (); dag = localDate.getDayOfMonth ();

11. Konklusjon

Kompilatorer jobber med et fast sett med regler som er språkspesifikke. Hvis en kode ikke holder seg til disse reglene, kan ikke kompilatoren utføre en konverteringsprosess som resulterer i en kompileringsfeil. Når vi møter kompileringsfeilen "Kan ikke finne symbol", er nøkkelen å identifisere årsaken.

Fra feilmeldingen kan vi finne kodelinjen der feilen oppstår, og hvilket element som er galt. Å vite de vanligste problemene som forårsaker denne feilen, vil gjøre det veldig enkelt og raskt å løse det.


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