[Fixed] Sådan løses fejlen “Kan ikke finde symbol” i Java

Java er et alment formål, objektorienteret, stærkt maskinskrevet programmeringssprog til opbygning af web-, mobil- og virksomhedsapplikationer. Java, udviklet af Sun Microsystems og i øjeblikket ejet af Oracle Corporation, er blevet et meget populært programmeringssprog på grund af dets portabilitet, skalerbarhed, pålidelighed og stabilitet.

Når du skriver programmer ved hjælp af Java, er Java programmeringssprog, at Java kildekoden først kompileres til bytekode. Bytekoden fortolkes derefter af Java Virtual Machine til maskinkode, hvilket gør det muligt for Java-programmet at køre. Derfor er Java både et kompileret og fortolket sprog.

Kompilering involverer at scanne en hel kildekode og oversætte den til maskinkode på én gang. En tolk konverterer på den anden side kildekode til maskinkode en linje ad gangen.

Under kompileringen opretter compileren en liste over alle identifikatorer, der bruges i programmet. I Java er identifikatorer navne givet til de forskellige elementer i programmet, såsom variabler, klasser, metoder, pakker og grænseflader, blandt andre.

Når et Java-program kompileres, kan der opstå fejl under kompileringsprocessen. Sådanne fejl er kendt som kompileringsfejl eller kompileringsfejl. Kompileringsfejl forhindrer Java-kompileren i at generere et programs bytekode.

Kompileringsfejl forhindrer dit program i at blive kompileret. Sådanne fejl kan være forårsaget af syntaks, semantiske eller strukturelle fejl i kildekoden. Et eksempel på en kompileringsfejl er fejlen Kan ikke finde symbol.

fejl: kan ikke finde symbol

Som nævnt tidligere opretter Java-kompileren under kompileringen en liste over alle identifikatorer, der bruges i programmet, og den finder ud af, hvad hver identifikator betyder. Hvis compileren finder en identifikator, den ikke genkender, eller den ikke kan fortælle, hvad identifikatoren refererer til, opstår en symbolfejl, der ikke kan findes.

En kan ikke finde symbol fejl er compilerens måde at fortælle dig, at du bruger en identifikator, som den ikke kan forstå og dermed ikke kan finde ud af, hvad identifikatoren skal gøre.

Dette kan skyldes, at den identifikator, du forsøger at bruge, ikke er blevet erklæret, ikke er tilgængelig inden for det omfang, du bruger den, eller ikke er blevet importeret korrekt. En fejl, der ikke kan finde symbol, kan føre til mislykket kompilering.

Årsager til fejlen: kan ikke finde symbol

Nogle af de potentielle årsager til fejlen: kan ikke finde symbol inkluderer:

  • Typografiske fejl fører til fejlstavede variabler, metoder, klasser eller pakkenavne. Brug af forkert store og små bogstaver fører også til denne fejl, da Java er store og små bogstaver.
  • Brug af en variabel, metode eller klasse, der ikke er blevet erklæret, eller brug af den før dens faktiske erklæring.
  • Brug af variabler, metoder eller klasser uden for det omfang, de er blevet erklæret i.
  • Oprettelse af en forekomst af en klasse uden at bruge det nye nøgleord
  • Manglende importerklæringer, når du forsøger at bruge klasser fra andre pakker. Undladelse af at importere en klasse, der er i en anden pakke, før den bruges, vil også forårsage denne fejl.
  • Forkert pakkeimport.

Når compileren opdager nogen af ​​ovenstående fejl i din kode, vil den stoppe kompileringen og smide fejlen kan ikke finde symbolet.

Eksempler på fejl: kan ikke finde symbol

Lad os tage et detaljeret kig på kodeeksempler, der viser de forskellige årsager til symbolfejlen, der ikke kan findes, og hvordan man løser fejlen.

#1. Typografiske fejl

Fejlstavede variabler, metoder, klasser eller pakkenavne og forkerte tilfælde fører til, at symbolet ikke kan findes. Overvej koden nedenfor:

class Test {
  public static void main(String[] args) {
    int even_number = 4;
    System.out.println(even_numbe); // misspelled variable name
    System.out.println(Even_number);// wrong case
    int sum = addnumber(5, 20); // misspelled method name, wrong case
    System.out.println(sum);
  }
  
  public static int addNumbers(int a, int b) {
    int result = a + b;
    return result;
  }
}

Resultatet af kompilering af koden ovenfor er vist nedenfor:

For at rette fejlene skal du sikre dig, at du bruger den korrekte metode og variabelnavne. I eksemplet var variablen lige_tal og metodenavnet addNumbers stavet forkert, og de brugte forkerte bogstaver. For at rette disse fejl skal du bruge den korrekte variabel og metodenavn, der er lige_tal, og tilføjeNumber som vist nedenfor:

class Test {
  public static void main(String[] args) {
    int even_number = 4;
    System.out.println(even_number); // Correct variable name with the right case
    System.out.println(even_number); // Correct variable name with the right case
    int sum = addNumbers(5, 20); // Correct method name
    System.out.println(sum);
  }

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

Produktion:

4
4
25

#2. Uoplyst variabel

Ikke-erklærede variabler, ved at bruge variabler før erklæringen og bruge variabler, metoder og klasser uden for deres omfang resulterer i, at symbolet ikke kan findes som vist nedenfor:

class Test {
  public static void main(String[] args) {
    System.out.println(y); // y is undeclared
    System.out.println(num); // num used before its declaration
    int num = 4; // num's declaration and initialization
    if (num > 3) {
      int x = 2;
    };
    System.out.println(x); // x - used outside its scope
  }
}

Resultatet af kompilering af denne kode er vist nedenfor:

For at rette denne fejl skal du sørge for at erklære hver variabel du bruger i dit program og kun bruge dem efter at have erklæret dem. I vores tilfælde blev variablerne y og num brugt, før de blev erklæret. Ret denne fejl ved at bruge dem efter deres erklæring.

Variablen x blev brugt uden for det omfang, den blev erklæret i. For at rette op på dette, brug den i if-blokken, hvor den er blevet erklæret som vist nedenfor:

class Test {
  public static void main(String[] args) {
    String y = "Hello World";
    System.out.println(y); // y - used after it has been declared
    int num = 4; 
    System.out.println(num); // num - used after it has been declared
    
    if (num > 3) {
      int x = 2;
      System.out.println(x); // x - used within the scope of the if statement
    };
  }
}

Produktion:

Hello World
4
2

#3. Variabler, metoder og klasser uden for rammerne

Brug af variabler, metoder og klasser uden for det omfang, de er blevet erklæret i, vil føre til et symbol, der ikke kan findes, som vist i koden nedenfor:

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

Kompilering af denne kode fører til følgende fejl:

For at rette fejlen skal du sikre dig, at du bruger variabelnummeret inden for det omfang, det er blevet erklæret. Det er inden for omfanget af if-blokken som vist nedenfor:

class Test {
  public static void main(String[] args) {
    if (true) {
      int number = 10;
      System.out.println(number); // number - used within the scope of the if block
    }
  }
}

Produktion:

10

#4. Oprettelse af en forekomst af en klasse uden at bruge det nye nøgleord

Java er et objektorienteret sprog, og du kan således oprette objekter også kendt som klasseforekomster i et Java-program. Men hvis du gør dette uden at bruge det nye søgeord, vil du støde på et kan ikke finde-symbol 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) {
    // Creating an instance of the Car class without using new
    Car myCar = Car("Ford", "Fiesta");

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

Kompilering af koden resulterer i en fejl som vist nedenfor:

For at rette fejlen skal du bruge det nye nøgleord, når du opretter objekter. For at oprette en forekomst af en klasse i Java skal du bruge det nye nøgleord. For at oprette en instans af klassen Car skal du altså bruge new Car() 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) {
    // Instance of Car created correctly by using the new keyword
    Car myCar = new Car("Ford", "Fiesta");

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

Produktion:

Make: Ford
Model: Fiesta

#5. Manglende import

Forsøg på at bruge en klasse fundet i en anden pakke uden at importere den fører til, at symbolet kan ikke finde ikke fejl. Se koden nedenfor:

class Test {
  public static void main(String[] args) {
    System.out.println("Hello, enter any number");
    // Missing import for the Scanner class
    Scanner scanner = new Scanner(System.in);
    int number = scanner.nextInt();
    System.out.println("The number you entered is: " + number);
    scanner.close();
  }
}

Resultatet af kompilering af koden er vist nedenfor:

Scanner-klassen bruges til at få brugerinput fra tastaturet i et Java-program. For at bruge det skal du først importere det til den fil, du vil bruge det. Import af scannerklassen gør den tilgængelig til brug som vist. Importerklæringen er den første linje i koden nedenfor:

import java.util.Scanner;
class Test {
  public static void main(String[] args) {
    System.out.println("Hello, enter any number");
    // Missing import for the Scanner class
    Scanner scanner = new Scanner(System.in);
    int number = scanner.nextInt();
    System.out.println("The number you entered is: " + number);
    scanner.close();
  }
}

Produktion:

Hello, enter any number
45
The number you entered is: 45

#6. Forkert import

Bortset fra manglende import af en pakke, du vil bruge, kan import af den forkerte pakke også føre til et kan ikke finde symbol. Overvej koden nedenfor:

import java.util.Dates; // importing the wrong package - correct package is Date
class Test {
  public static void main(String[] args) {
    Dates now = new Dates();
        System.out.println(now);
  }
}

Kompilering af koden resulterer i følgende fejl:

For at rette op på de genererede symboler, der ikke kan findes, skal du sikre dig, at du importerer den rigtige pakke. I koden, der genererede en fejl, var den klasse, der blev importeret, Dates. Der er dog ingen indbygget klasse kaldet Dates. Det korrekte navn er Dato. Derfor, for at fjerne fejlen, skal du importere Dato og ikke Datoer som vist nedenfor:

import java.util.Date; // importing the correct package - Date and not Dates
class Test {
  public static void main(String[] args) {
    Date now = new Date();
        System.out.println(now);
  }
}

Produktion:

Thu Aug 17 12:02:12 EAT 2023

Virkning af fejl: kan ikke finde symbolet i kompilering

Da det er en kompileringsfejl, er den mest umiddelbare virkning af fejlen, der ikke kan finde symbol, en fejl i kompileringsprocessen. Når Java kompileres til bytekode, resulterer fejl i kildekoden i fejl i kompileringsprocessen. Derfor vil der ikke blive genereret nogen bytekode, der skal bruges til at udføre programmet.

Når sådanne fejl opstår, er den åbenlyse årsag til handling at begynde at fejlfinde din kildekode for at finde, hvad der forårsager fejlene, og rette fejlene. Mens fejlretning kan have fordelen ved at hjælpe dig med at blive bedre fortrolig med et sprog, kan det føre til udviklingsforsinkelser. Derudover påvirkes den overordnede kildekodekvalitet på grund af fejl i kildekoden.

Konklusion

De kan ikke finde symbolfejl, en meget almindelig fejl, og du er forpligtet til at støde på dem, mens du skriver Java-kode. Heldigvis er det også en meget nem fejl at undgå. Kan ikke finde symbolfejl resultater fra forkert brug af identifikatorer. For at undgå fejlen skal du sørge for at erklære alle dine variabler, metoder og klasser, før du bruger dem.

Sørg desuden for, at du ikke laver nogen stavefejl, når du refererer til de identifikatorer, du bruger i dit program, og brug alle dine identifikatorer inden for det omfang, du har erklæret dem. Endelig, hvis du vil bruge en pakke eller eksterne klasser i dit program, skal du sørge for at importere de rigtige pakker til dit program, før du begynder at bruge dem.

Du kan også udforske den bedste Java-overvågningssoftware til virksomheder.