[Fixed] Jak rozwiązać błąd „Nie można znaleźć symbolu” w Javie

Java to zorientowany obiektowo, zorientowany obiektowo język programowania ogólnego przeznaczenia, służący do tworzenia aplikacji internetowych, mobilnych i korporacyjnych. Java, opracowana przez Sun Microsystems i obecnie należąca do Oracle Corporation, stała się bardzo popularnym językiem programowania ze względu na swoją przenośność, skalowalność, niezawodność i stabilność.

Podczas pisania programów przy użyciu języka Java, język programowania Java polega na tym, że Java kod źródłowy jest najpierw kompilowany do kodu bajtowego. Kod bajtowy jest następnie interpretowany przez wirtualną maszynę Java na kod maszynowy, umożliwiając w ten sposób uruchomienie programu Java. Dlatego Java jest zarówno językiem kompilowanym, jak i interpretowanym.

Kompilacja obejmuje skanowanie całego kodu źródłowego i jednoczesne tłumaczenie go na kod maszynowy. Z drugiej strony interpreter konwertuje kod źródłowy na kod maszynowy po jednym wierszu na raz.

Podczas kompilacji kompilator tworzy listę wszystkich identyfikatorów użytych w programie. W języku Java identyfikatory to nazwy nadawane różnym elementom programu, takim jak między innymi zmienne, klasy, metody, pakiety i interfejsy.

Podczas kompilacji programu Java mogą wystąpić błędy podczas procesu kompilacji. Takie błędy są znane jako błędy kompilacji lub błędy czasu kompilacji. Błędy kompilacji uniemożliwiają kompilatorowi Java pomyślne wygenerowanie kodu bajtowego programu.

Błędy kompilacji uniemożliwiają skompilowanie programu. Błędy takie mogą być spowodowane błędami składniowymi, semantycznymi lub strukturalnymi w kodzie źródłowym. Przykładem błędu kompilacji jest błąd Nie można znaleźć symbolu.

błąd: nie można znaleźć symbolu

Jak wspomniano wcześniej, podczas kompilacji kompilator Javy tworzy listę wszystkich identyfikatorów używanych w programie i ustala, co każdy z nich oznacza. Jeśli kompilator znajdzie identyfikator, którego nie rozpoznaje lub nie może określić, do czego odnosi się identyfikator, pojawia się błąd „nie można znaleźć symbolu”.

Błąd „nie można znaleźć symbolu” to sposób, w jaki kompilator informuje cię, że używasz identyfikatora, którego nie może zrozumieć, a zatem nie może dowiedzieć się, co powinien zrobić identyfikator.

Może to być spowodowane tym, że identyfikator, którego próbujesz użyć, nie został zadeklarowany, nie jest dostępny w używanym zakresie lub nie został poprawnie zaimportowany. Błąd „nie można znaleźć symbolu” może prowadzić do niepowodzenia kompilacji.

Przyczyny błędu: nie można znaleźć symbolu

Niektóre z potencjalnych przyczyn błędu: nie można znaleźć symbolu obejmują:

  • Błędy typograficzne prowadzą do błędnej pisowni zmiennych, metod, klas lub nazw pakietów. Użycie niewłaściwej wielkości liter również prowadzi do tego błędu, ponieważ Java rozróżnia wielkość liter.
  • Używanie zmiennej, metody lub klasy, która nie została zadeklarowana lub użycie ich przed faktyczną deklaracją.
  • Używanie zmiennych, metod lub klas poza zakresem, w którym zostały zadeklarowane.
  • Tworzenie instancji klasy bez użycia słowa kluczowego new
  • Brakujące instrukcje importu podczas próby użycia klas z innych pakietów. Nieudane zaimportowanie klasy znajdującej się w innym pakiecie przed jej użyciem również spowoduje ten błąd.
  • Nieprawidłowy import pakietu.

Gdy kompilator wykryje którykolwiek z powyższych błędów w twoim kodzie, zatrzyma kompilację i zgłosi błąd „nie można znaleźć symbolu”.

Przykłady błędów: nie można znaleźć symbolu

Przyjrzyjmy się szczegółowo przykładom kodu pokazującym różne przyczyny błędu „nie można znaleźć symbolu” i sposoby rozwiązania tego błędu.

# 1. Błędy typograficzne

Błędnie napisane zmienne, metody, klasy lub nazwy pakietów oraz błędne przypadki prowadzą do błędu „nie można znaleźć symbolu”. Rozważ poniższy kod:

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;
  }
}

Wynik kompilacji powyższego kodu pokazano poniżej:

Aby poprawić błędy, upewnij się, że używasz poprawnej metody i nazw zmiennych. W przykładzie zmienna numer_parzysty i nazwa metody addNumbers zostały napisane błędnie i użyto niewłaściwych wielkości liter. Aby poprawić te błędy, użyj poprawnej nazwy zmiennej i metody, czyli parzystej_liczby, i dodaj liczby, jak pokazano poniżej:

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;
  }
}

Wyjście:

4
4
25

#2. Niezadeklarowana zmienna

Niezadeklarowane zmienne, użycie zmiennych przed deklaracją oraz użycie zmiennych, metod i klas poza ich zakresem powoduje, że nie można znaleźć symbolu, jak pokazano poniżej:

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
  }
}

Wynik kompilacji tego kodu pokazano poniżej:

Aby poprawić ten błąd, pamiętaj o zadeklarowaniu każdej zmiennej używanej w programie i używaj ich dopiero po ich zadeklarowaniu. W naszym przypadku zmienne y i num zostały użyte przed zadeklarowaniem. Popraw ten błąd, używając ich po ich zadeklarowaniu.

Zmienna x została użyta poza zakresem, w którym została zadeklarowana. Aby to poprawić, użyj jej w bloku if, w którym została zadeklarowana, jak pokazano poniżej:

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
    };
  }
}

Wyjście:

Hello World
4
2

#3. Zmienne, metody i klasy poza zakresem

Używanie zmiennych, metod i klas poza zakresem, w którym zostały zadeklarowane, doprowadzi do symbolu „nie można znaleźć”, jak pokazano w poniższym kodzie:

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

Kompilacja tego kodu prowadzi do następującego błędu:

Aby poprawić błąd, upewnij się, że używasz numeru zmiennej w zakresie, w jakim został zadeklarowany. To mieści się w zakresie bloku if, jak pokazano poniżej:

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
    }
  }
}

Wyjście:

10

#4. Tworzenie instancji klasy bez użycia słowa kluczowego new

Java jest językiem zorientowanym obiektowo, dzięki czemu w programie Java można tworzyć obiekty znane również jako instancje klas. Jeśli jednak zrobisz to bez użycia nowego słowa kluczowego, napotkasz symbol niemożności znalezienia, jak pokazano poniżej:

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());
  }
}

Kompilacja kodu powoduje błąd, jak pokazano poniżej:

Aby poprawić błąd, użyj słowa kluczowego new za każdym razem, gdy tworzysz obiekty. Aby utworzyć instancję klasy w Javie, musisz użyć słowa kluczowego new. Aby utworzyć instancję klasy Car, musisz więc użyć funkcji new Car(), jak pokazano poniżej:

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());
  }
}

Wyjście:

Make: Ford
Model: Fiesta

#5. Brak importu

Próba użycia klasy znalezionej w innym pakiecie bez importowania prowadzi do błędu „nie można znaleźć symbolu”. Zobacz poniższy kod:

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();
  }
}

Wynik kompilacji kodu pokazano poniżej:

Klasa Scanner służy do uzyskiwania danych wprowadzanych przez użytkownika z klawiatury w programie Java. Aby go użyć, musisz najpierw zaimportować go do pliku, którego chcesz użyć. Zaimportowanie klasy skanera udostępnia ją do użytku, jak pokazano. Instrukcja importu to pierwsza linia w poniższym kodzie:

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();
  }
}

Wyjście:

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

#6. Nieprawidłowy import

Oprócz niepowodzenia importowania pakietu, którego chcesz użyć, importowanie niewłaściwego pakietu może również prowadzić do wyświetlenia symbolu „nie można znaleźć”. Rozważ poniższy kod:

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);
  }
}

Kompilacja kodu powoduje następujące błędy:

Aby poprawić generowane błędy związane z niemożnością znalezienia symbolu, upewnij się, że importujesz właściwy pakiet. W kodzie, który wygenerował błąd, zaimportowana klasa to Dates. Jednak nie ma wbudowanej klasy o nazwie Dates. Prawidłowa nazwa to Data. Dlatego, aby usunąć błąd, zaimportuj datę, a nie daty, jak pokazano poniżej:

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);
  }
}

Wyjście:

Thu Aug 17 12:02:12 EAT 2023

Wpływ błędu: nie można znaleźć symbolu w kompilacji

Będąc błędem kompilacji, najbardziej bezpośrednim skutkiem błędu nie można znaleźć symbolu jest awaria procesu kompilacji. Gdy Java jest kompilowana do kodu bajtowego, błędy wykryte w kodzie źródłowym powodują niepowodzenie procesu kompilacji. Dlatego żaden kod bajtowy nie zostanie wygenerowany do użycia podczas wykonywania programu.

Kiedy pojawiają się takie błędy, oczywistą przyczyną działania jest rozpoczęcie debugowania kodu źródłowego w celu znalezienia przyczyny błędów i poprawienia błędów. Podczas gdy debugowanie może mieć tę zaletę, że pomaga lepiej zapoznać się z językiem, może to prowadzić do opóźnień w rozwoju. Ponadto ogólna jakość kodu źródłowego ma wpływ na błędy w kodzie źródłowym.

Wniosek

Nie mogą znaleźć błędów symboli, co jest bardzo częstym błędem i na pewno napotkasz je podczas pisania kodu Java. Na szczęście jest to również bardzo łatwy do uniknięcia błąd. Nie można znaleźć błędu symbolu wynika z niewłaściwego użycia identyfikatorów. Dlatego, aby uniknąć błędu, upewnij się, że zadeklarowałeś wszystkie swoje zmienne, metody i klasy przed ich użyciem.

Ponadto upewnij się, że nie robisz literówek podczas odwoływania się do identyfikatorów, których używasz w swoim programie, i używaj wszystkich swoich identyfikatorów w zakresie, w jakim je zadeklarowałeś. Na koniec, jeśli będziesz używać w swoim programie jakiegokolwiek pakietu lub klas zewnętrznych, upewnij się, że zaimportowałeś odpowiednie pakiety do swojego programu, zanim zaczniesz ich używać.

Możesz także zapoznać się z najlepszym oprogramowaniem monitorującym Java dla firm.