De compilatiefout "Kan symbool niet vinden"

1. Overzicht

In deze zelfstudie bekijken we wat compilatiefouten zijn en leggen we vervolgens specifiek uit wat de fout "kan symbool niet vinden" is en hoe deze wordt veroorzaakt.

2. Compileer tijdfouten

Tijdens het compileren analyseert en verifieert de compiler de code voor tal van zaken; reference types, type casts en method declarations om er maar een paar te noemen. Dit deel van het compilatieproces is belangrijk omdat we tijdens deze fase een compilatiefout krijgen.

In principe zijn er drie soorten compilatiefouten:

  • We kunnen syntaxisfouten hebben. Een van de meest voorkomende fouten die een programmeur kan maken, is het vergeten van de puntkomma aan het einde van de instructie; sommige anderen vergeten invoer, passen haakjes niet bij elkaar of laten de retourverklaring achterwege
  • Vervolgens zijn ertypecontrolefouten. Dit is een proces om typeveiligheid in onze code te verifiëren. Met deze controle zorgen we ervoor dat we consistente typen uitdrukkingen hebben. Als we bijvoorbeeld een variabele van het type definiëren int, mogen we nooit een dubbele of Draad waarde voor
  • Ondertussen bestaat de mogelijkheid dat de compiler crasht. Dit is zeer zeldzaam, maar het kan gebeuren. In dit geval is het goed om te weten dat onze code misschien geen probleem is, maar eerder een extern probleem

3. De fout "kan symbool niet vinden"

De fout "kan symbool niet vinden" komt voornamelijk voor wanneer we proberen een variabele te gebruiken die niet is gedefinieerd of gedeclareerd in ons programma.

Wanneer onze code compileert, moet de compiler alle identificatiegegevens die we hebben verifiëren. De fout"Kan symbool niet vinden" betekent dat we zijnverwijzend naar iets waar de compiler niets vanaf weet.

3.1. Wat kan de oorzaak zijn "kan symbool niet vinden" Fout?

Echt, er is maar één oorzaak: De compiler kan de definitie van een variabele waarnaar we proberen te verwijzen, niet vinden.

Maar er zijn veel redenen waarom dit gebeurt. Laten we, om ons te helpen begrijpen, eraan te herinneren waaruit Java-code bestaat.

Onze Java-broncode bestaat uit:

  • Sleutelwoorden: true, false, class, while
  • Letterlijke letters: cijfers en tekst
  • Operatoren en andere niet-alfanumerieke tokens: -, /, +, =, {
  • ID's: hoofd, Lezer, ik, toString, enz.
  • Opmerkingen en witruimte

4. Spelfout

De meest voorkomende problemen zijn allemaal spellinggerelateerd. Als we ons herinneren dat alle Java-ID's hoofdlettergevoelig zijn, kunnen we zien dat:

  • StringBiulder
  • stringBuilder
  • String_Builder

zouden allemaal verschillende manieren zijn om ten onrechte naar de StringBuilder klasse.

5. Instantiebereik

Deze fout kan ook worden veroorzaakt bij het gebruik van iets dat buiten het bereik van de klasse is gedeclareerd.

Laten we bijvoorbeeld zeggen dat we een Artikel klasse die een genereerId methode:

public class Article {private int length; privé lange id; openbaar artikel (int lengte) {this.length = lengte; this.id = generationId (); }}

Maar we verklaren het genereerId methode in een aparte klasse:

openbare klasse IdGenerator {openbare long GenerationId () {Random random = nieuwe Random (); return random.nextInt (); }}

Met deze setup geeft de compiler een "kan symbool niet vinden" -fout voor genereerId op regel 7 van de Artikel fragment. De reden is dat de syntaxis van regel 7 impliceert dat de genereerId methode wordt gedeclareerd in Artikel.

Zoals in alle volwassen talen, is er meer dan één manier om dit probleem aan te pakken. Maar een manier zou zijn om te construeren IdGenerator in de Artikel class en roep vervolgens de methode aan:

public class Article {private int length; privé lange id; openbaar artikel (int lengte) {this.length = lengte; this.id = nieuwe IdGenerator (). generationId (); }}

6. Ongedefinieerde variabelen

Soms vergeten we de variabele te declareren. Zoals we kunnen zien in het onderstaande fragment, proberen we de variabele te manipuleren die we niet hebben gedeclareerd, in dit geval tekst:

public class Article {private int length; // ... public void setText (String newText) {this.text = newText; // tekstvariabele is nooit gedefinieerd}}

We lossen dit probleem op door de variabele te declareren tekst van het type Draad:

public class Article {private int length; private String-tekst; // ... public void setText (String newText) {this.text = newText; }}

7. Variabel toepassingsgebied

Als een variabeledeclaratie buiten het bereik valt op het moment dat we het probeerden te gebruiken, veroorzaakt dit een fout tijdens het compileren. Dit gebeurt meestal wanneer we met lussen werken.

Variabelen binnen de lus zijn niet toegankelijk buiten de lus:

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

De als verklaring moet binnen de for loop als we karakters meer moeten onderzoeken:

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

8. Ongeldig gebruik van methoden of velden

De fout "kan symbool niet vinden" zal ook optreden als we een veld als methode gebruiken of omgekeerd:

public class Article {private int length; privé lange id; privélijstteksten; openbaar artikel (int lengte) {this.length = lengte; } // getters en setters}

Nu, als we proberen te verwijzen naar de artikelen teksten veld alsof het een methode is:

Artikelartikel = nieuw artikel (300); Lijstteksten = article.texts ();

dan zouden we de fout zien.

Dat komt omdat de compiler op zoek is naar een methode met de naam teksten, die er niet is.

Eigenlijk is er een getter methode die we in plaats daarvan kunnen gebruiken:

Artikelartikel = nieuw artikel (300); Lijstteksten = article.getTexts ();

Per ongeluk werken op een array in plaats van een array-element is ook een probleem:

for (String text: teksten) {String firstLetter = texts.charAt (0); // het moet text.charAt (0)} zijn

En zo is het vergeten van de nieuw trefwoord zoals in:

String s = String (); // zou 'new String ()' moeten zijn

9. Invoer van pakketten en klassen

Een ander probleem is het vergeten om de klasse of het pakket te importeren. Gebruik bijvoorbeeld een Lijst object zonder te importeren java.util.List:

// ontbrekende import statement: // import java.util.List public class Article {private int length; privé lange id; privélijstteksten; <- fout! openbaar artikel (int lengte) {this.length = lengte; }}

Deze code zou niet compileren omdat het programma niet weet wat Lijst is.

10. Verkeerde invoer

Het importeren van het verkeerde type vanwege IDE-voltooiing of automatische correctie is ook een veelvoorkomend probleem.

Denk aan de situatie waarin we datums in Java willen gebruiken. Vaak konden we een fout importeren Datum class, die geen methoden en functionaliteiten biedt als andere datumklassen die we mogelijk nodig hebben:

Datum datum = nieuwe datum (); int jaar, maand, dag;

Om het jaar, de maand of de dag op te halen java.util.Date, we moeten ook importeren Kalender klasse en extraheer de informatie daaruit.

Gewoon een beroep doen krijg datum() van java.util.Date zal niet werken:

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

In plaats daarvan gebruiken we de Kalender voorwerp:

... Calendar cal = Calendar.getInstance (TimeZone.getTimeZone ("Europa / Parijs")); cal.setTime (datum); jaar = cal.get (Calendar.YEAR); maand = cal.get (Calendar.MONTH); dag = cal.get (Calendar.DAY_OF_MONTH);

Als we echter het LocalDate class, hebben we geen aanvullende code nodig die ons de informatie geeft die we nodig hebben:

... LocalDate localDate = date.toInstant (). AtZone (ZoneId.systemDefault ()). ToLocalDate (); jaar = localDate.getYear (); maand = localDate.getMonthValue (); day = localDate.getDayOfMonth ();

11. Conclusie

Samenstellers werken volgens een vaste set regels die taalspecifiek zijn. Als een code zich niet aan deze regels houdt, kan de compiler geen conversieproces uitvoeren, wat resulteert in een compilatiefout. Als we de compilatiefout 'Kan symbool niet vinden' tegenkomen, is het zaak de oorzaak te achterhalen.

Uit het foutbericht kunnen we de coderegel vinden waar de fout optreedt en welk element verkeerd is. Als u de meest voorkomende problemen kent die deze fout veroorzaken, is het heel gemakkelijk en snel op te lossen.