[Fixed] Jak vyřešit chybu „Nelze najít symbol“ v Javě

Java je univerzální, objektově orientovaný a silně typovaný programovací jazyk, který se používá k vytváření aplikací pro web, mobilní zařízení i podniková řešení. Původně vyvinutý společností Sun Microsystems, nyní spravovaný Oracle Corporation, se Java stala populární díky své přenositelnosti, škálovatelnosti, spolehlivosti a stabilitě.

Při vytváření programů v jazyce Java se zdrojový kód nejprve transformuje do mezikódu, tzv. bajtkódu. Tento bajtkód je následně interpretován virtuálním strojem Java (JVM) do strojového kódu, což umožňuje spuštění aplikace. Java tedy kombinuje prvky kompilovaného i interpretovaného jazyka.

Proces kompilace spočívá v analýze celého zdrojového kódu a jeho jednorázovém překladu do strojového kódu. Interpret naopak překládá zdrojový kód do strojového kódu postupně, řádek po řádku.

Během kompilace kompilátor sestavuje seznam všech identifikátorů použitých v programu. Identifikátory v jazyce Java slouží jako jména pro různé programové elementy, jako jsou proměnné, třídy, metody, balíčky a rozhraní.

V průběhu kompilace programu v Javě mohou nastat chyby, které se označují jako chyby kompilace. Tyto chyby kompilace brání úspěšnému vygenerování bajtkódu programu kompilátorem Java.

Chyby kompilace, způsobené syntaktickými, sémantickými nebo strukturálními chybami v kódu, zabraňují úspěšné kompilaci programu. Příkladem takové chyby je „Cannot Find Symbol Error“, tedy chyba „nelze nalézt symbol“.

Chyba: Nelze Najít Symbol

Jak už bylo zmíněno, kompilátor Java si během procesu kompilace vytváří seznam všech použitých identifikátorů a zjišťuje jejich význam. Pokud kompilátor narazí na identifikátor, který nerozpozná, nebo nemůže určit jeho odkaz, dojde k chybě „nelze nalézt symbol“.

Chyba „cannot find symbol error“ je tedy způsob, jakým kompilátor signalizuje, že narazil na identifikátor, kterému nerozumí a nemůže určit, co má s ním dělat.

Tato situace může nastat, pokud identifikátor nebyl deklarován, není dostupný v daném kontextu nebo nebyl správně importován. Chyba „nelze nalézt symbol“ tak vede k neúspěšné kompilaci.

Příčiny Chyby: Nelze Najít Symbol

Mezi možné příčiny chyby „nelze nalézt symbol“ patří:

  • Překlepy v názvech proměnných, metod, tříd nebo balíčků. Chyby v malých a velkých písmenech, protože Java rozlišuje mezi nimi.
  • Použití proměnné, metody nebo třídy, která nebyla deklarována, nebo je použita před samotnou deklarací.
  • Použití proměnných, metod nebo tříd mimo jejich deklarovaný rozsah.
  • Vytvoření instance třídy bez použití klíčového slova `new`.
  • Chybějící importy při pokusu o použití tříd z jiných balíčků. Chyba také nastane, pokud chybí import třídy, která se nachází v jiném balíčku, před jejím použitím.
  • Nesprávný import balíčku.

Když kompilátor narazí na některou z těchto chyb, zastaví kompilaci a ohlásí chybu „cannot find symbol error“.

Příklady Chyb: Nelze Najít Symbol

Pojďme si podrobněji prohlédnout příklady kódu ilustrující různé příčiny chyby „nelze najít symbol“ a jak tyto chyby opravit.

#1. Překlepy

Nesprávně napsané názvy proměnných, metod, tříd nebo balíčků a nesprávné použití velkých a malých písmen vedou k chybě „nelze najít symbol“. Prohlédněte si následující kód:

class Test {
  public static void main(String[] args) {
    int even_number = 4;
    System.out.println(even_numbe); // chybně napsaný název proměnné
    System.out.println(Even_number);// nesprávné použití velkých a malých písmen
    int sum = addnumber(5, 20); // chybně napsaný název metody, nesprávné použití velkých a malých písmen
    System.out.println(sum);
  }
  
  public static int addNumbers(int a, int b) {
    int result = a + b;
    return result;
  }
}

Výsledkem kompilace tohoto kódu je:

Pro odstranění chyb je třeba se ujistit, že používáte správné názvy metod a proměnných. V tomto příkladu byly proměnná `even_number` a název metody `addNumbers` napsány chybně a byla použita nesprávná kombinace velkých a malých písmen. Pro opravu je třeba použít správný název proměnné `even_number` a název metody `addNumbers`, jak je uvedeno níže:

class Test {
  public static void main(String[] args) {
    int even_number = 4;
    System.out.println(even_number); // Správný název proměnné se správnou kombinací velkých a malých písmen
    System.out.println(even_number); // Správný název proměnné se správnou kombinací velkých a malých písmen
    int sum = addNumbers(5, 20); // Správný název metody
    System.out.println(sum);
  }

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

Výstup:

4
4
25

#2. Nedeklarovaná Proměnná

Nedeklarované proměnné, použití proměnné před její deklarací a použití proměnné, metody nebo třídy mimo její rozsah vede k chybě „nelze najít symbol“, jak je znázorněno níže:

class Test {
  public static void main(String[] args) {
    System.out.println(y); // y není deklarovaná
    System.out.println(num); // num je použita před deklarací
    int num = 4; // deklarace a inicializace proměnné num
    if (num > 3) {
      int x = 2;
    };
    System.out.println(x); // x - použita mimo svůj rozsah
  }
}

Výsledkem kompilace tohoto kódu je:

Pro opravu této chyby musíte zajistit, že každá proměnná, kterou používáte ve svém programu, je deklarována, a použita až po její deklaraci. V našem případě byly proměnné `y` a `num` použity před jejich deklarací. Opravíte to tak, že je použijete až po jejich deklaraci.

Proměnná `x` byla použita mimo svůj rozsah. Pro opravu ji použijte uvnitř bloku `if`, kde byla deklarována, jak je uvedeno níže:

class Test {
  public static void main(String[] args) {
    String y = "Hello World";
    System.out.println(y); // y - použita po deklaraci
    int num = 4; 
    System.out.println(num); // num - použita po deklaraci
    
    if (num > 3) {
      int x = 2;
      System.out.println(x); // x - použita v rozsahu bloku if
    };
  }
}

Výstup:

Hello World
4
2

#3. Proměnné, Metody a Třídy Mimo Rozsah

Použití proměnných, metod a tříd mimo rozsah, ve kterém byly deklarovány, vede k chybě „nelze najít symbol“, jak ukazuje následující kód:

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

Kompilace tohoto kódu vede k následující chybě:

Pro opravu této chyby musíte zajistit, že použijete proměnnou v rozsahu, ve kterém byla deklarována. V tomto případě, v rozsahu bloku `if`, jak je znázorněno níže:

class Test {
  public static void main(String[] args) {
    if (true) {
      int number = 10;
      System.out.println(number); // number - použita v rozsahu bloku if
    }
  }
}

Výstup:

10

#4. Vytvoření Instance Třídy Bez Použití Klíčového Slova `new`

Java je objektově orientovaný jazyk, a proto můžete v programu v Javě vytvářet objekty, které jsou instancemi tříd. Pokud to však uděláte bez použití klíčového slova `new`, dojde k chybě „nelze najít symbol“, jak je znázorněno níže:

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) {
    // Vytvoření instance třídy Car bez použití new
    Car myCar = Car("Ford", "Fiesta");

    System.out.println("Značka: " + myCar.getMake());
    System.out.println("Model: " + myCar.getModel());
  }
}

Kompilace tohoto kódu vyústí v následující chybu:

Pro opravu chyby použijte při vytváření objektů klíčové slovo `new`. Pro vytvoření instance třídy v Javě musíte použít klíčové slovo `new`. Pro vytvoření instance třídy `Car` je třeba použít `new Car()`, jak je uvedeno níže:

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 třídy Car vytvořena správně pomocí klíčového slova new
    Car myCar = new Car("Ford", "Fiesta");

    System.out.println("Značka: " + myCar.getMake());
    System.out.println("Model: " + myCar.getModel());
  }
}

Výstup:

Značka: Ford
Model: Fiesta

#5. Chybějící Import

Pokus o použití třídy z jiného balíčku bez importování vede k chybě „nelze najít symbol“. Prohlédněte si následující kód:

class Test {
  public static void main(String[] args) {
    System.out.println("Ahoj, zadejte libovolné číslo");
    // Chybějící import pro třídu Scanner
    Scanner scanner = new Scanner(System.in);
    int number = scanner.nextInt();
    System.out.println("Zadané číslo je: " + number);
    scanner.close();
  }
}

Výsledkem kompilace tohoto kódu je:

Třída `Scanner` se v programu Java používá k získání vstupu od uživatele z klávesnice. Pro její použití je nutné ji nejdříve importovat do souboru, ve kterém ji chcete použít. Import třídy `Scanner` ji zpřístupní k použití, jak je znázorněno. Příkaz `import` je prvním řádkem v níže uvedeném kódu:

import java.util.Scanner;
class Test {
  public static void main(String[] args) {
    System.out.println("Ahoj, zadejte libovolné číslo");
    // Chybějící import pro třídu Scanner
    Scanner scanner = new Scanner(System.in);
    int number = scanner.nextInt();
    System.out.println("Zadané číslo je: " + number);
    scanner.close();
  }
}

Výstup:

Ahoj, zadejte libovolné číslo
45
Zadané číslo je: 45

#6. Nesprávný Import

Kromě selhání importovat balíček, který chcete použít, může také importování nesprávného balíčku vést k chybě „nelze najít symbol“. Uvažujte následující kód:

import java.util.Dates; // importování nesprávného balíčku - správný balíček je Date
class Test {
  public static void main(String[] args) {
    Dates now = new Dates();
        System.out.println(now);
  }
}

Kompilace tohoto kódu vede k následujícím chybám:

Pro opravu chyb vyvolaných chybou „nelze najít symbol“ se ujistěte, že importujete správný balíček. V kódu, který generoval chybu, byla importována třída `Dates`. Neexistuje však vestavěná třída s názvem `Dates`. Správný název je `Date`. Pro odstranění chyby proto importujte `Date`, nikoliv `Dates`, jak je uvedeno níže:

import java.util.Date; // importování správného balíčku - Date, nikoliv Dates
class Test {
  public static void main(String[] args) {
    Date now = new Date();
        System.out.println(now);
  }
}

Výstup:

Thu Aug 17 12:02:12 EAT 2023

Dopad Chyby: Nelze Najít Symbol Při Kompilaci

Protože se jedná o chybu kompilace, bezprostředním dopadem chyby „nelze najít symbol“ je selhání procesu kompilace. Pokud kompilátor Java narazí ve zdrojovém kódu na chyby, proces kompilace se nezdaří. V důsledku toho nebude vygenerován žádný bajtkód, který by byl použit při provádění programu.

Když se takové chyby objeví, je zjevné, že je třeba začít ladit zdrojový kód, abyste zjistili příčiny a následně je opravili. Ladění vám sice může pomoci lépe se seznámit s jazykem, může však vést ke zpoždění vývoje. Celková kvalita zdrojového kódu je ovlivněna chybami v kódu.

Závěr

Chyba „nelze najít symbol“ je poměrně běžná, se kterou se můžete setkat při psaní kódu v Javě. Naštěstí se jedná o chybu, které se dá snadno vyhnout. Tato chyba je způsobena nesprávným použitím identifikátorů. Abyste se jí vyhnuli, musíte se ujistit, že jste deklarovali všechny své proměnné, metody a třídy, než je použijete.

Dále se ujistěte, že při odkazování na identifikátory, které používáte ve svém programu, neděláte překlepy a používáte všechny své identifikátory v rozsahu, ve kterém jste je deklarovali. A konečně, v případě, že ve svém programu používáte externí balíčky nebo třídy, ujistěte se, že jste do svého programu importovali správné balíčky předtím, než je začnete používat.

Doporučujeme vám také prozkoumat nejlepší monitorovací software Java pro podniky.