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.