Java «Kan ikke finne symbol»-feil: Slik løser du den!

«`html

Java er et allsidig, objektorientert og sterkt typet programmeringsspråk, ideelt for utvikling av web-, mobil- og bedriftsapplikasjoner. Utviklet av Sun Microsystems og nå eid av Oracle Corporation, har Java oppnådd stor popularitet som programmeringsspråk, hovedsakelig på grunn av sin portabilitet, skalerbarhet, pålitelighet og stabilitet.

Ved programmering i Java blir kildekoden først transformert til bytekode gjennom en kompileringsprosess. Deretter tolkes denne bytekoden av Java Virtual Machine (JVM) til maskinkode, slik at Java-programmet kan utføres. Dette gjør Java til et språk som kombinerer aspekter av både kompilering og tolking.

Kompilering innebærer at hele kildekoden analyseres og oversettes til maskinkode i en enkelt operasjon. En tolk, derimot, konverterer kildekoden til maskinkode linje for linje.

Under kompileringen oppretter kompilatoren en oversikt over alle identifikatorer som brukes i programmet. I Java er identifikatorer navn som tildeles ulike komponenter i programmet, slik som variabler, klasser, metoder, pakker og grensesnitt.

Under kompileringen av et Java-program kan det oppstå feil. Disse feilene kalles kompileringsfeil eller feil ved kompileringstid. Kompileringsfeil forhindrer Java-kompilatoren i å generere bytekoden for programmet.

Kompileringsfeil hindrer programmet fra å bli fullstendig kompilert. Disse feilene kan skyldes syntaksfeil, semantiske feil eller strukturelle feil i kildekoden. En vanlig kompileringsfeil er den såkalte «finner ikke symbol»-feilen.

Feilmelding: Finner ikke symbol

Som tidligere nevnt, lager Java-kompilatoren under kompileringen en liste over alle identifikatorer som brukes, og fastslår betydningen av hver enkelt. Hvis kompilatoren støter på en identifikator som den ikke gjenkjenner, eller ikke kan fastslå hva den refererer til, oppstår en «finner ikke symbol»-feil.

Denne feilmeldingen er kompilatorens måte å informere om at en identifikator som ikke forstås, brukes, og at kompilatoren derfor ikke kan avgjøre hva den er ment å gjøre.

Årsakene kan være at identifikatoren ikke er deklarert, ikke er tilgjengelig i det gjeldende omfanget, eller ikke er importert korrekt. En «finner ikke symbol»-feil kan føre til at kompileringen mislykkes.

Årsaker til feilen «Finner ikke symbol»

Noen vanlige årsaker til «finner ikke symbol»-feilen inkluderer:

  • Skrivefeil i navn på variabler, metoder, klasser eller pakker. Feil bruk av store og små bokstaver kan også utløse denne feilen, siden Java er et språk som skiller mellom store og små bokstaver.
  • Forsøk på å bruke en variabel, metode eller klasse som ikke er deklarert eller som brukes før sin faktiske deklarasjon.
  • Bruk av variabler, metoder eller klasser utenfor deres definerte omfang.
  • Opprettelse av et klasseobjekt uten bruk av nøkkelordet new.
  • Manglende import-setninger når det forsøkes å bruke klasser fra andre pakker. Manglende import av en klasse som befinner seg i en annen pakke, vil også føre til denne feilen.
  • Feil import av pakker.

Når kompilatoren oppdager en av disse feilene i koden, vil den stoppe kompileringen og generere en «finner ikke symbol»-feil.

Eksempler på feilen «Finner ikke symbol»

La oss se nærmere på kodeeksempler som illustrerer de ulike årsakene til «finner ikke symbol»-feilen, og hvordan den kan korrigeres.

#1. Skrivefeil

Feilstavede variabler, metoder, klasser eller pakkenavn, samt feil bruk av store og små bokstaver, kan føre til «finner ikke symbol»-feilen. Vurder følgende kode:

class Test {
    public static void main(String[] args) {
      int even_number = 4;
      System.out.println(even_numbe); // Feilstavet variabelnavn
      System.out.println(Even_number);// Feil bruk av store/små bokstaver
      int sum = addnumber(5, 20); // Feilstavet metodenavn, feil bruk av store/små bokstaver
      System.out.println(sum);
    }
    
    public static int addNumbers(int a, int b) {
      int result = a + b;
      return result;
    }
  }

Resultatet av kompileringen av koden ovenfor vises nedenfor:

For å korrigere feilene, sørg for at du bruker korrekte metode- og variabelnavn. I eksemplet var variabelen even_number og metodenavnet addNumbers feilstavet og brukt med feil bruk av store/små bokstaver. For å fikse dette, må de korrekte navnene even_number og addNumbers brukes, som vist nedenfor:

class Test {
    public static void main(String[] args) {
      int even_number = 4;
      System.out.println(even_number); // Korrekt variabelnavn med riktig bruk av store/små bokstaver
      System.out.println(even_number); // Korrekt variabelnavn med riktig bruk av store/små bokstaver
      int sum = addNumbers(5, 20); // Korrekt metodenavn
      System.out.println(sum);
    }

    public static int addNumbers(int a, int b) {
      int result = a + b;
      return result;
    }
  }

Utdata:

4
4
25

#2. Udeklarert variabel

Udeklarerte variabler, bruk av variabler før deres deklarasjon og bruk av variabler, metoder og klasser utenfor deres omfang, kan også forårsake «finner ikke symbol»-feilen, som illustrert nedenfor:

class Test {
    public static void main(String[] args) {
      System.out.println(y); // y er ikke deklarert
      System.out.println(num); // num brukes før deklarasjon
      int num = 4; // Deklarasjon og initialisering av num
      if (num > 3) {
        int x = 2;
      };
      System.out.println(x); // x - brukes utenfor sitt definerte omfang
    }
  }

Resultatet av å kompilere denne koden er:

For å rette denne feilen, sørg for å deklarere alle variabler før de brukes, og kun bruk dem etter at de er deklarert. I dette eksemplet ble variablene y og num brukt før de var deklarert. Rett dette ved å bruke dem etter deklarasjonen.

Variabelen x ble brukt utenfor omfanget den var deklarert i. For å korrigere dette, må den brukes innenfor if-blokken, der den er deklarert, som vist nedenfor:

class Test {
    public static void main(String[] args) {
      String y = "Hello World";
      System.out.println(y); // y - brukes etter at den er deklarert
      int num = 4; 
      System.out.println(num); // num - brukes etter at den er deklarert
      
      if (num > 3) {
        int x = 2;
        System.out.println(x); // x - brukes innenfor omfanget av if-setningen
      };
    }
  }

Utdata:

Hello World
4
2

#3. Variabler, metoder og klasser utenfor omfanget

Bruk av variabler, metoder og klasser utenfor deres deklarerte omfang vil også føre til at «finner ikke symbol»-feilen oppstår, som vist i koden under:

class Test {
    public static void main(String[] args) {
      if (true) {
        int number = 10;
      }
      System.out.println(number); // 'number' er utenfor omfang
    }
  }

Kompilering av denne koden gir følgende feil:

For å rette opp feilen, sørg for at variabelen number brukes innenfor omfanget der den er deklarert, altså innenfor if-blokken som vist under:

class Test {
    public static void main(String[] args) {
      if (true) {
        int number = 10;
        System.out.println(number); // number - brukes innenfor omfanget av if-blokken
      }
    }
  }

Utdata:

10

#4. Opprette en forekomst av en klasse uten å bruke nøkkelordet «new»

Java er et objektorientert språk, noe som betyr at det er mulig å lage objekter, også kjent som klasseforekomster. Hvis dette gjøres uten å bruke nøkkelordet new, vil man møte en «finner ikke symbol»-feil, som vist nedenfor:

public class Car {
    private String make;
    private String model;

    public Car(String make, String model) {
      this.make = make;
      this.model = model;
    }

    public String getMake() {
      return make;
    }

    public String getModel() {
      return model;
    }

    public static void main(String[] args) {
      // Oppretter en forekomst av klassen Car uten å bruke new
      Car myCar = Car("Ford", "Fiesta");

      System.out.println("Make: " + myCar.getMake());
      System.out.println("Model: " + myCar.getModel());
    }
  }

Kompilering av koden resulterer i følgende feil:

For å rette opp feilen, må nøkkelordet new brukes ved oppretting av objekter. For å lage en forekomst av en klasse i Java, må du bruke nøkkelordet new. I dette tilfellet, for å lage en forekomst av klassen Car, må man bruke new Car() som vist under:

public class Car {
    private String make;
    private String model;

    public Car(String make, String model) {
      this.make = make;
      this.model = model;
    }

    public String getMake() {
      return make;
    }

    public String getModel() {
      return model;
    }

    public static void main(String[] args) {
      // Forekomst av Car opprettet korrekt ved hjelp av nøkkelordet new
      Car myCar = new Car("Ford", "Fiesta");

      System.out.println("Make: " + myCar.getMake());
      System.out.println("Model: " + myCar.getModel());
    }
  }

Utdata:

Make: Ford
Model: Fiesta

#5. Manglende import

Forsøk på å bruke en klasse som befinner seg i en annen pakke uten å importere den, vil også føre til «finner ikke symbol»-feilen. Se på koden under:

class Test {
    public static void main(String[] args) {
      System.out.println("Hei, skriv inn et tall");
      // Mangler import for klassen Scanner
      Scanner scanner = new Scanner(System.in);
      int number = scanner.nextInt();
      System.out.println("Tallet du skrev inn er: " + number);
      scanner.close();
    }
  }

Resultatet av kompileringen av denne koden vises nedenfor:

Klassen Scanner brukes for å motta brukerinndata fra tastaturet i et Java-program. For å bruke den, må man først importere den til filen den skal brukes i. Import av Scanner-klassen gjør den tilgjengelig for bruk, som vist under. Import-erklæringen er den første linjen i koden nedenfor:

import java.util.Scanner;
  class Test {
    public static void main(String[] args) {
      System.out.println("Hei, skriv inn et tall");
      // Mangler import for klassen Scanner
      Scanner scanner = new Scanner(System.in);
      int number = scanner.nextInt();
      System.out.println("Tallet du skrev inn er: " + number);
      scanner.close();
    }
  }

Utdata:

Hei, skriv inn et tall
45
Tallet du skrev inn er: 45

#6. Feil import

I tillegg til å unnlate å importere en pakke, kan feil import også føre til «finner ikke symbol»-feilen. Vurder følgende kode:

import java.util.Dates; // Importerer feil pakke - riktig pakke er Date
  class Test {
    public static void main(String[] args) {
      Dates now = new Dates();
          System.out.println(now);
    }
  }

Kompilering av denne koden resulterer i følgende feil:

For å rette opp feil relatert til «finner ikke symbol», sørg for at riktig pakke importeres. I koden som genererte feilen, var klassen som ble importert Dates. Det finnes imidlertid ingen innebygd klasse som heter Dates. Det korrekte navnet er Date. Derfor må Date og ikke Dates importeres for å unngå feilen, som vist nedenfor:

import java.util.Date; // Importerer riktig pakke - Date og ikke Dates
  class Test {
    public static void main(String[] args) {
      Date now = new Date();
          System.out.println(now);
    }
  }

Utdata:

Thu Aug 17 12:02:12 EAT 2023

Virkning av «finner ikke symbol»-feil under kompilering

Siden dette er en kompileringsfeil, er den mest umiddelbare konsekvensen av «finner ikke symbol»-feilen at kompileringen mislykkes. Når Java-kode kompileres til bytekode, vil feil som oppdages i kildekoden føre til feil i kompileringen. Dermed genereres ingen bytekode, som er nødvendig for å kjøre programmet.

Når slike feil oppstår, er den åpenbare reaksjonen å begynne å feilsøke kildekoden for å finne årsaken til feilene og korrigere dem. Selv om feilsøking kan bidra til å øke kjennskapen til språket, kan det også føre til forsinkelser i utviklingsprosessen. I tillegg kan den generelle kvaliteten på kildekoden bli påvirket av feilene.

Konklusjon

«Finner ikke symbol»-feilen er en veldig vanlig feil som man lett vil støte på når man programmerer i Java. Heldigvis er det også en feil som er lett å unngå. Feilen skyldes feil bruk av identifikatorer. For å unngå feilen, er det viktig å deklarere alle variabler, metoder og klasser før de tas i bruk.

Sørg i tillegg for at det ikke forekommer skrivefeil når du refererer til identifikatorer, og bruk alle identifikatorer innenfor det definerte omfanget. Når du bruker pakker eller eksterne klasser, må du huske å importere de riktige pakkene før de tas i bruk.

Du kan også undersøke de beste Java-overvåkingsløsningene for bedrifter.

«`