[Fixed] Како да решите грешку „Није могуће пронаћи симбол“ у Јави

Java predstavlja opštenamenski, objektno-orijentisani programski jezik sa strogim tipovima, koji se koristi za razvoj veb, mobilnih i poslovnih aplikacija. Ovaj jezik, prvobitno kreiran od strane Sun Microsystems, a sada u vlasništvu Oracle korporacije, stekao je veliku popularnost zahvaljujući svojoj prenosivosti, skalabilnosti, pouzdanosti i stabilnosti.

Prilikom pisanja programa u Javi, proces uključuje kompilaciju izvornog koda u bajt kod. Nakon toga, Java virtuelna mašina (JVM) interpretira taj bajt kod u mašinski kod, omogućavajući izvršavanje Java programa. Zbog ovog procesa, Java se smatra i kompajliranim i interpretiranim jezikom.

Kompilacija podrazumeva detaljnu analizu celokupnog izvornog koda i njegovo prevođenje u mašinski kod u jednom potezu. S druge strane, interpretator konvertuje izvorni kod u mašinski kod red po red.

Tokom kompilacije, kompajler kreira spisak svih identifikatora koji se koriste u programu. U Javi, identifikatori predstavljaju imena koja se dodeljuju različitim elementima programa, kao što su promenljive, klase, metode, paketi i interfejsi.

Tokom kompilacije Java programa, mogu se pojaviti greške. Te greške se nazivaju greškama kompilacije ili greškama u vreme prevođenja. Kompilacione greške sprečavaju Java kompajler da uspešno generiše bajt kod programa.

Kompilacione greške sprečavaju prevod vašeg programa. Ove greške mogu nastati zbog sintaksnih, semantičkih ili strukturalnih problema u izvornom kodu. Primer greške pri kompilaciji je greška „Cannot Find Symbol“.

Greška: ne mogu pronaći simbol

Kao što je već pomenuto, tokom kompilacije, Java kompajler sastavlja listu svih identifikatora koji se koriste u programu i utvrđuje značenje svakog identifikatora. Ako kompajler naiđe na identifikator koji ne prepoznaje ili ne može da utvrdi njegovo značenje, dolazi do greške „simbol ne može da se pronađe“.

Ova greška je način na koji kompajler obaveštava da koristite identifikator koji on ne razume, i stoga ne može da shvati njegovu svrhu.

Razlozi za ovu grešku mogu biti različiti: identifikator koji pokušavate da koristite nije deklarisan, nije dostupan u okviru trenutnog opsega ili nije ispravno uvezen. Greška „simbol ne može da se pronađe“ može dovesti do neuspešne kompilacije.

Uzroci greške: ne mogu pronaći simbol

Neki od potencijalnih uzroka greške „ne mogu pronaći simbol“ uključuju:

  • Tipografske greške koje dovode do pogrešno napisanih imena promenljivih, metoda, klasa ili paketa. Neispravna upotreba velikih i malih slova takođe može dovesti do ove greške, s obzirom na to da je Java osetljiva na velika i mala slova.
  • Korišćenje promenljive, metode ili klase koja nije deklarisana ili korišćenje pre njene deklaracije.
  • Korišćenje promenljivih, metoda ili klasa izvan opsega u kojem su deklarisane.
  • Kreiranje instance klase bez korišćenja ključne reči ‘new’.
  • Nedostatak ‘import’ naredbi kada pokušavate da koristite klase iz drugih paketa. Neuspešno uvoženje klase koja se nalazi u drugom paketu pre upotrebe takođe može dovesti do ove greške.
  • Netačno uvoženje paketa.

Kada kompajler detektuje bilo koju od navedenih grešaka u vašem kodu, zaustaviće kompilaciju i prijaviti grešku „ne mogu pronaći simbol“.

Primeri grešaka: ne mogu pronaći simbol

Detaljnije ćemo analizirati primere koda koji ilustruju različite uzroke greške „simbol ne može da se pronađe“ i kako da rešimo ovu grešku.

#1. Tipografske greške

Pogrešno napisane promenljive, metode, klase ili imena paketa, kao i neispravno korišćenje velikih i malih slova, dovode do greške „simbol ne može da se pronađe“. Razmotrite sledeći kod:

class Test {
  public static void main(String[] args) {
    int even_number = 4;
    System.out.println(even_numbe); // pogrešno napisano ime promenljive
    System.out.println(Even_number);// pogrešna upotreba velikih i malih slova
    int sum = addnumber(5, 20); // pogrešno napisano ime metode, pogrešna upotreba velikih i malih slova
    System.out.println(sum);
  }

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

Rezultat kompiliranja gore navedenog koda prikazan je u nastavku:

Da biste ispravili ove greške, uverite se da koristite tačne nazive metoda i promenljivih. U primeru, promenljiva ‘even_number’ i ime metode ‘addNumbers’ su pogrešno napisani i imaju nepravilnu upotrebu velikih i malih slova. Da biste ispravili ove greške, koristite ispravne nazive promenljivih i metoda, odnosno ‘even_number’ i ‘addNumbers’, kao što je prikazano u nastavku:

class Test {
  public static void main(String[] args) {
    int even_number = 4;
    System.out.println(even_number); // Ispravno ime promenljive sa tačnim velikim i malim slovima
    System.out.println(even_number); // Ispravno ime promenljive sa tačnim velikim i malim slovima
    int sum = addNumbers(5, 20); // Ispravno ime metode
    System.out.println(sum);
  }

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

Izlaz:

4
4
25

#2. Nedeklarisana promenljiva

Nedeklarisane promenljive, korišćenje promenljivih pre njihove deklaracije i korišćenje promenljivih, metoda i klasa izvan njihovog opsega rezultiraju greškom „simbol ne može da se pronađe“, kao što je prikazano u nastavku:

class Test {
  public static void main(String[] args) {
    System.out.println(y); // y nije deklarisano
    System.out.println(num); // num se koristi pre deklaracije
    int num = 4; // deklaracija i inicijalizacija promenljive num
    if (num > 3) {
      int x = 2;
    };
    System.out.println(x); // x - koristi se van opsega
  }
}

Rezultat kompilacije ovog koda prikazan je u nastavku:

Da biste ispravili ovu grešku, obavezno deklarišite svaku promenljivu koju koristite u programu i koristite je tek nakon što je deklarišete. U našem slučaju, promenljive ‘y’ i ‘num’ su korišćene pre nego što su deklarisane. Ispravite ovu grešku tako što ćete ih koristiti nakon deklaracije.

Promenljiva ‘x’ je korišćena izvan opsega u kojem je deklarisana. Da biste ovo ispravili, koristite je unutar ‘if’ bloka gde je deklarisana, kao što je prikazano ispod:

class Test {
  public static void main(String[] args) {
    String y = "Hello World";
    System.out.println(y); // y - koristi se nakon što je deklarisana
    int num = 4;
    System.out.println(num); // num - koristi se nakon što je deklarisana
    if (num > 3) {
      int x = 2;
      System.out.println(x); // x - koristi se unutar opsega if naredbe
    };
  }
}

Izlaz:

Hello World
4
2

#3. Promenljive, metode i klase van opsega

Korišćenje promenljivih, metoda i klasa izvan opsega u kojem su deklarisane dovodi do greške „simbol ne može da se pronađe“, kao što je prikazano u sledećem kodu:

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

Kompilacija ovog koda rezultira sledećom greškom:

Da biste ispravili ovu grešku, uverite se da koristite promenljivu ‘number’ unutar opsega u kojem je deklarisana. To je unutar ‘if’ bloka, kao što je prikazano u nastavku:

class Test {
  public static void main(String[] args) {
    if (true) {
      int number = 10;
      System.out.println(number); // number - koristi se unutar opsega if bloka
    }
  }
}

Izlaz:

10

#4. Kreiranje instance klase bez upotrebe ključne reči ‘new’

Java je objektno-orijentisani jezik, stoga je moguće kreirati objekte, poznate i kao instance klase, u Java programu. Međutim, ako ovo uradite bez upotrebe ključne reči ‘new’, naići ćete na grešku „simbol ne može da se pronađe“, kao što je prikazano u nastavku:

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) {
    // Kreiranje instance klase Car bez korišćenja 'new'
    Car myCar = Car("Ford", "Fiesta");

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

Kompilacija ovog koda rezultira greškom kao što je prikazano u nastavku:

Da biste ispravili ovu grešku, koristite ključnu reč ‘new’ svaki put kada kreirate objekte. Da biste kreirali instancu klase u Javi, morate koristiti ključnu reč ‘new’. Dakle, da biste kreirali instancu klase ‘Car’, morate koristiti ‘new Car()’, kao što je prikazano ispod:

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) {
    // Instanca klase Car kreirana ispravno pomoću ključne reči 'new'
    Car myCar = new Car("Ford", "Fiesta");

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

Izlaz:

Make: Ford
Model: Fiesta

#5. Nedostatak ‘import’ naredbe

Pokušaj korišćenja klase koja se nalazi u drugom paketu bez njenog uvoza dovodi do greške „simbol ne može da se pronađe“. Pogledajte kod ispod:

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

Rezultat kompilacije ovog koda prikazan je u nastavku:

Klasa ‘Scanner’ se koristi za dobijanje korisničkog unosa sa tastature u Java programu. Da biste je koristili, prvo je morate uvesti u datoteku u kojoj želite da je koristite. Uvoženje klase ‘Scanner’ omogućava njenu upotrebu, kao što je prikazano. Naredba ‘import’ je prvi red u kodu ispod:

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

Izlaz:

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

#6. Netačan ‘import’

Osim što ne uspete da uvezete paket koji želite da koristite, uvoz pogrešnog paketa takođe može dovesti do greške „simbol ne može da se pronađe“. Razmotrite sledeći kod:

import java.util.Dates; // uvoz pogrešnog paketa - tačan paket je Date
class Test {
  public static void main(String[] args) {
    Dates now = new Dates();
    System.out.println(now);
  }
}

Kompilacija ovog koda rezultira sledećim greškama:

Da biste ispravili generisane greške „simbol ne može da se pronađe“, uverite se da uvozite ispravan paket. U kodu koji je generisao grešku, klasa koja je uvezena bila je ‘Dates’. Međutim, ne postoji ugrađena klasa koja se zove ‘Dates’. Tačan naziv je ‘Date’. Stoga, da biste uklonili grešku, uvezite ‘Date’, a ne ‘Dates’, kao što je prikazano u nastavku:

import java.util.Date; // uvoz ispravnog paketa - Date, a ne Dates
class Test {
  public static void main(String[] args) {
    Date now = new Date();
    System.out.println(now);
  }
}

Izlaz:

Thu Aug 17 12:02:12 EAT 2023

Uticaj greške: ne mogu pronaći simbol u kompilaciji

S obzirom na to da je ovo greška kompilacije, najdirektniji uticaj greške „simbol ne može da se pronađe“ je neuspeh u procesu kompilacije. Kada se Java kompilira u bajt kod, greške u izvornom kodu dovode do neuspeha procesa kompilacije. Prema tome, neće biti generisan bajt kod koji bi se koristio za izvršavanje programa.

Kada se ovakve greške pojave, očigledan korak je da počnete sa debagovanjem izvornog koda, da biste otkrili uzrok grešaka i da biste ih ispravili. Iako debagovanje može pomoći da se bolje upoznate sa jezikom, može dovesti do kašnjenja u razvoju. Osim toga, greške u izvornom kodu utiču na ukupan kvalitet izvornog koda.

Zaključak

Greške „ne mogu pronaći simbol“ su česte i sigurno ćete se susresti sa njima prilikom pisanja Java koda. Na sreću, ovo je greška koju je vrlo lako izbeći. Greška „ne mogu pronaći simbol“ nastaje kao rezultat neispravne upotrebe identifikatora. Zato, da biste izbegli grešku, uverite se da ste deklarisali sve promenljive, metode i klase pre upotrebe.

Pored toga, uverite se da ne pravite greške u kucanju kada se pozivate na identifikatore koje koristite u programu, i koristite sve identifikatore u okviru opsega u kojem su deklarisani. Na kraju, u slučaju da koristite bilo koje pakete ili spoljašnje klase u programu, obavezno uvezite ispravne pakete u program pre nego što počnete da ih koristite.

Takođe, možete istražiti najbolji Java softver za praćenje za preduzeća.