[Fixed] Hur man löser felet ”Kan inte hitta symbol” i Java

By rik

En Djupdykning i Javas ”Kan inte hitta symbol” Fel

Java är ett mångsidigt, objektorienterat och starkt typat programmeringsspråk som används flitigt för att skapa applikationer för webben, mobila enheter och företag. Java, som ursprungligen utvecklades av Sun Microsystems och numera ägs av Oracle Corporation, är känt för sin portabilitet, skalbarhet, tillförlitlighet och robusthet, vilket gör det till ett populärt val bland utvecklare.

I Java-programmering kompileras källkoden först till bytekod. Denna bytekod exekveras sedan av Java Virtual Machine (JVM), vilket omvandlar den till maskinkod som datorn förstår. Denna process gör Java till både ett kompilerat och tolkat språk.

Kompilering involverar analys av hela källkoden och översättning till maskinkod på en gång. En tolk å andra sidan översätter källkoden till maskinkod steg för steg, rad för rad.

Under kompilering skapar kompilatorn en lista över alla identifierare som används i programmet. I Java är identifierare de namn vi ger till olika delar av koden, som variabler, klasser, metoder, paket och gränssnitt.

Under kompileringen kan fel uppstå, dessa kallas kompileringsfel. Kompileringsfel förhindrar Java-kompilatorn från att framgångsrikt generera programmets bytekod.

Ett kompileringsfel hindrar ditt program från att kompileras och kan bero på syntaxfel, semantiska problem eller strukturella fel i källkoden. Ett vanligt exempel är felet ”Kan inte hitta symbol”.

Fel: Kan inte hitta symbol

Som tidigare nämnts bygger Java-kompilatorn under kompileringen upp en lista över alla identifierare i programmet och försöker förstå deras betydelse. Om kompilatorn stöter på en identifierare som den inte känner igen, eller som den inte kan knyta till någon definition, resulterar det i ett ”Kan inte hitta symbol”-fel.

Detta fel signalerar att du använder en identifierare som kompilatorn inte förstår och därför inte vet hur den ska hantera. Detta kan inträffa om identifieraren inte har deklarerats, inte är tillgänglig inom det använda omfånget, eller inte har importerats korrekt. Ett ”Kan inte hitta symbol”-fel stoppar kompileringen.

Orsaker till ”Kan inte hitta symbol”-felet

Här är några av de vanligaste orsakerna till att ”Kan inte hitta symbol”-felet uppstår:

  • Skrivfel: Felstavade namn på variabler, metoder, klasser eller paket. Java är skiftlägeskänsligt, så felaktig användning av stora och små bokstäver kan också leda till detta fel.
  • Odeklarerade identifierare: Användning av en variabel, metod eller klass som inte har deklarerats, eller användning av dem före själva deklarationen.
  • Felaktigt omfång: Användning av variabler, metoder eller klasser utanför det omfång där de har definierats.
  • Saknat ”new”: Att skapa en instans av en klass utan att använda nyckelordet ”new”.
  • Saknade import-satser: När man försöker använda klasser från andra paket utan att först importera dem.
  • Felaktig import: Att importera fel paket.

När kompilatorn upptäcker något av dessa problem, avbryts kompileringen och felet ”Kan inte hitta symbol” genereras.

Exempel på ”Kan inte hitta symbol”-fel

Låt oss utforska några exempel som illustrerar hur dessa fel kan uppstå och hur man löser dem.

#1. Skrivfel

Skrivfel i variabel-, metod-, klass- eller paketnamn, liksom felaktig användning av skiftläge, orsakar ”Kan inte hitta symbol”-fel. Se följande kodexempel:

    class Test {
      public static void main(String[] args) {
        int even_number = 4;
        System.out.println(even_numbe); // felstavat variabelnamn
        System.out.println(Even_number); // fel skiftläge
        int sum = addnumber(5, 20); // felstavat metodnamn, fel skiftläge
        System.out.println(sum);
      }
    
      public static int addNumbers(int a, int b) {
        int result = a + b;
        return result;
      }
    }
  

Resultatet av att kompilera ovanstående kod blir som följer:

För att rätta till dessa fel måste vi använda korrekta variabel- och metodnamn. I exemplet var variabeln `even_number` och metoden `addNumbers` felstavade och skiftläget användes felaktigt. Rätt version ser ut så här:

  class Test {
    public static void main(String[] args) {
      int even_number = 4;
      System.out.println(even_number); // Korrekt variabelnamn med rätt skiftläge
      System.out.println(even_number); // Korrekt variabelnamn med rätt skiftläge
      int sum = addNumbers(5, 20); // Korrekt metodnamn
      System.out.println(sum);
    }
  
    public static int addNumbers(int a, int b) {
      int result = a + b;
      return result;
    }
  }
  

Utskrift:

4
4
25
  

#2. Odeklarerad variabel

Att använda variabler innan de har deklarerats, eller utanför deras omfång, orsakar också ”Kan inte hitta symbol”-fel. Betrakta följande kod:

    class Test {
      public static void main(String[] args) {
        System.out.println(y); // y är odeklarerad
        System.out.println(num); // num används före deklarationen
        int num = 4; // deklaration och initiering av num
        if (num > 3) {
          int x = 2;
        };
        System.out.println(x); // x används utanför sitt omfång
      }
    }
  

Kompilering av denna kod leder till:

För att lösa detta fel, deklarera varje variabel innan du använder den. I vårt exempel användes `y` och `num` innan de deklarerades. Variabeln `x` användes utanför sitt omfång. Den korrekta versionen ser ut så här:

    class Test {
      public static void main(String[] args) {
        String y = "Hello World";
        System.out.println(y); // y används efter deklarationen
        int num = 4; 
        System.out.println(num); // num används efter deklarationen
    
        if (num > 3) {
          int x = 2;
          System.out.println(x); // x används inom if-satsens omfång
        };
      }
    }
  

Utskrift:

Hello World
4
2
    

#3. Variabler, metoder och klasser utanför omfånget

Att använda identifierare utanför det omfång där de definierades kommer att orsaka felet ”Kan inte hitta symbol”, som visas i detta exempel:

  class Test {
    public static void main(String[] args) {
      if (true) {
        int number = 10;
      }
      System.out.println(number); // 'number' är utanför omfånget
    }
  }
  

Kompilering av denna kod ger följande fel:

För att rätta till det här felet måste variabeln `number` användas inom if-satsens omfång:

  class Test {
    public static void main(String[] args) {
      if (true) {
        int number = 10;
        System.out.println(number); // number - används inom if-satsens omfång
      }
    }
  }
  

Utskrift:

10
  

#4. Skapa en instans av en klass utan nyckelordet ”new”

Java är ett objektorienterat språk där man skapar objekt, även kallade instanser av klasser. Om man försöker skapa ett objekt utan nyckelordet `new`, kommer man att få ett ”Kan inte hitta symbol”-fel. Här är ett exempel:

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) {
        // Skapa en instans av Car-klassen utan 'new'
        Car myCar = Car("Ford", "Fiesta");
    
        System.out.println("Märke: " + myCar.getMake());
        System.out.println("Modell: " + myCar.getModel());
      }
    }
    

Kompilering av den här koden resulterar i följande fel:

För att lösa detta problem måste nyckelordet `new` användas när man skapar objekt. Rätt version ser ut så här:

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) {
    // Skapa instans av Car korrekt med nyckelordet 'new'
    Car myCar = new Car("Ford", "Fiesta");

    System.out.println("Märke: " + myCar.getMake());
    System.out.println("Modell: " + myCar.getModel());
  }
}
    

Utskrift:

Märke: Ford
Modell: Fiesta
    

#5. Saknad import

Att försöka använda en klass från ett annat paket utan att importera det orsakar också ”Kan inte hitta symbol”-fel. Här är ett exempel:

class Test {
  public static void main(String[] args) {
    System.out.println("Hej, ange ett nummer");
    // Saknas import för Scanner-klassen
    Scanner scanner = new Scanner(System.in);
    int number = scanner.nextInt();
    System.out.println("Du angav numret: " + number);
    scanner.close();
  }
}
    

Kompilering ger följande fel:

Scanner-klassen används för att läsa inmatning från användaren i Java. För att använda den måste den importeras. Den korrekta koden ser ut så här:

import java.util.Scanner;
class Test {
  public static void main(String[] args) {
    System.out.println("Hej, ange ett nummer");
    // Importera Scanner-klassen
    Scanner scanner = new Scanner(System.in);
    int number = scanner.nextInt();
    System.out.println("Du angav numret: " + number);
    scanner.close();
  }
}
    

Utskrift:

Hej, ange ett nummer
45
Du angav numret: 45
    

#6. Felaktig import

Förutom att glömma att importera paket kan även felaktig import orsaka fel av typen ”Kan inte hitta symbol”. Se följande kod:

import java.util.Dates; // felaktigt paket - ska vara Date
class Test {
  public static void main(String[] args) {
    Dates now = new Dates();
        System.out.println(now);
  }
}
  

Kompilering av koden ger detta fel:

För att rätta till det måste rätt paket importeras. I koden ovan försökte vi importera en klass som heter `Dates` men den korrekta klassen heter `Date`. Korrekt import ser ut så här:

import java.util.Date; // Korrekt paket - Date istället för Dates
class Test {
  public static void main(String[] args) {
    Date now = new Date();
        System.out.println(now);
  }
}
  

Utskrift:

Thu Aug 17 12:02:12 EAT 2023
  

Konsekvenser av ”Kan inte hitta symbol”-fel vid kompilering

Eftersom detta är ett kompileringsfel kommer det att resultera i att kompileringsprocessen misslyckas. När Java-kod kompileras till bytekod kommer fel i källkoden att förhindra att bytekod genereras. Därför kommer programmet inte att kunna köras.

När sådana fel inträffar måste källkoden felsökas för att hitta och rätta till felen. Detta kan leda till utvecklingsförseningar och den övergripande kvaliteten på källkoden kan påverkas av buggar.

Slutsats

”Kan inte hitta symbol”-fel är vanliga och du kommer med största sannolikhet att stöta på dem under din Java-programmeringsresa. Lyckligtvis är det ganska enkelt att undvika dem. Felet uppstår pga felaktig användning av identifierare. För att undvika dem, se till att alla variabler, metoder och klasser deklareras innan de används.

Undvik stavfel, använd alla dina identifierare inom deras definierade omfång och se till att alla paket och externa klasser du använder importeras korrekt. Att följa dessa riktlinjer kommer att minska risken för detta fel och bidra till en mer framgångsrik utvecklingsprocess.

Du kanske också är intresserad av att utforska den bästa Java-övervakningsmjukvaran för företag.