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

Јава је опште намене, објектно оријентисан, снажно куцани програмски језик за прављење веб, мобилних и пословних апликација. Јава, коју је развио Сун Мицросистемс, а тренутно је у власништву корпорације Орацле, постала је веома популаран програмски језик због своје преносивости, скалабилности, поузданости и стабилности.

Када пишете програме користећи Јаву, програмски језик Јава је тај да се Јава изворни код прво компајлира у бајт код. Јава виртуелна машина затим интерпретира бајт код у машински код, омогућавајући тако Јава програму да се покрене. Стога је Јава и компајлирани и интерпретирани језик.

Компилација укључује скенирање целог изворног кода и његово превођење у машински код одједном. Тумач, с друге стране, конвертује изворни код у машински код ред по ред.

Током компилације, компајлер креира листу свих идентификатора који се користе у програму. У Јави, идентификатори су имена која се дају различитим елементима у програму, као што су променљиве, класе, методе, пакети и интерфејси, између осталог.

Када се компајлира Јава програм, током процеса компилације могу настати грешке. Такве грешке су познате као грешке компилације или грешке у времену превођења. Грешке при компилацији спречавају Јава компајлер да успешно генерише бајт код програма.

Грешке при компилацији спречавају превођење вашег програма. Такве грешке могу бити узроковане синтаксним, семантичким или структурним грешкама у изворном коду. Пример грешке при компилацији је грешка Цаннот Финд Симбол.

грешка: не могу пронаћи симбол

Као што је раније поменуто, током компилације, Јава компајлер креира листу свих идентификатора који се користе у програму и открива шта сваки идентификатор значи. Ако компајлер пронађе идентификатор који не препознаје или не може да каже на шта се идентификатор односи, долази до грешке симбола не може да пронађе.

Грешка симбола не може да се пронађе је начин на који вам компајлер каже да користите идентификатор који он не може да разуме и самим тим не може да схвати шта идентификатор треба да ради.

То може бити зато што идентификатор који покушавате да користите није декларисан, није доступан у оквиру опсега у којем га користите или није исправно увезен. Грешка симбола не може да се пронађе може довести до неуспешне компилације.

Узроци грешке: не могу пронаћи симбол

Неки од потенцијалних узрока грешке: не могу пронаћи симбол укључују:

  • Типографске грешке доводе до погрешно написаних променљивих, метода, класа или имена пакета. Коришћење погрешних великих и малих слова такође доводи до ове грешке, пошто је Јава осетљива на велика и мала слова.
  • Коришћење променљиве, методе или класе која није декларисана или коришћење пре њене стварне декларације.
  • Коришћење променљивих, метода или класа изван опсега у коме су декларисани.
  • Креирање инстанце класе без употребе нове кључне речи
  • Недостају наредбе за увоз када покушавате да користите класе из других пакета. Неуспех да увезете класу која се налази у другом пакету пре него што је употребите такође ће изазвати ову грешку.
  • Нетачан увоз пакета.
  Како користити сцп команду за сигуран пренос датотека у Линуку

Када преводилац открије било коју од горе наведених грешака у вашем коду, зауставиће компилацију и избацити грешку не може пронаћи симбол.

Примери грешака: не могу пронаћи симбол

Хајде да детаљно погледамо узорке кода који показују различите узроке грешке симбола не може да се пронађе и како да решимо грешку.

#1. Типографске грешке

Погрешно написане променљиве, методе, класе или имена пакета и погрешни случајеви доводе до грешке симбола не може да се пронађе. Размотрите код у наставку:

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

Резултат компајлирања кода изнад је приказан у наставку:

Да бисте исправили грешке, уверите се да користите исправне методе и имена променљивих. У примеру, променљива евен_нумбер и назив методе аддНумберс су погрешно написани и користили су погрешне случајеве. Да бисте исправили ове грешке, користите исправну променљиву и име методе које је парни_број и аддНумберс као што је приказано у наставку:

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

Излаз:

4
4
25

#2. Недекларисана променљива

Недекларисане променљиве, коришћење променљивих пре декларације и коришћење променљивих, метода и класа ван њиховог опсега резултирају немогућношћу проналажења симбола као што је приказано у наставку:

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

Резултат компајлирања овог кода је приказан у наставку:

Да бисте исправили ову грешку, обавезно декларишите сваку променљиву коју користите у свом програму и користите је тек након што је декларишете. У нашем случају, променљиве и и нум су коришћене пре него што су декларисане. Исправите ову грешку тако што ћете их користити након њихове декларације.

Променљива к је коришћена изван опсега у коме је декларисана. Да бисте ово исправили, користите је унутар иф блока где је декларисана као што је приказано испод:

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

Излаз:

Hello World
4
2

#3. Променљиве, методе и класе ван опсега

Коришћење променљивих, метода и класа изван опсега у коме су декларисани довешће до симбола не може се пронаћи као што је приказано у коду испод:

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

Компајлирање овог кода доводи до следеће грешке:

  11 најбољих бесплатних Екцел шаблона за личне финансије за буџет

Да бисте исправили грешку, уверите се да користите број променљиве у оквиру опсега који је декларисан. То је у оквиру иф блока као што је приказано у наставку:

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

Излаз:

10

#4. Креирање инстанце класе без употребе нове кључне речи

Јава је објектно оријентисан језик и стога можете креирати објекте познате и као инстанце класе у Јава програму. Међутим, ако ово урадите без употребе нове кључне речи, наићи ћете на симбол „Не могу да нађем“ као што је приказано у наставку:

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

Компајлирање кода доводи до грешке као што је приказано у наставку:

Да бисте исправили грешку, користите нову кључну реч кад год правите објекте. Да бисте креирали инстанцу класе у Јави, потребно је да користите нову кључну реч. Да бисте креирали инстанцу класе Цар, морате да користите нев Цар() као што је приказано испод:

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

Излаз:

Make: Ford
Model: Fiesta

#5. Недостаје увоз

Покушај коришћења класе пронађене у другом пакету без њеног увоза доводи до грешке не може да пронађе симбол. Погледајте код испод:

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

Резултат компајлирања кода је приказан у наставку:

  5 начина да процените када је веб локација покренута

Класа Сцаннер се користи за добијање корисничког уноса са тастатуре у Јава програму. Да бисте га користили, прво морате да га увезете у датотеку коју желите да користите. Увоз класе скенера чини је доступним за употребу као што је приказано. Изјава о увозу је први ред у коду испод:

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

Излаз:

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

#6. Нетачан увоз

Осим неуспеха при увозу пакета који желите да користите, увоз погрешног пакета такође може довести до немогућности проналажења симбола. Размотрите код у наставку:

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

Компајлирање кода доводи до следећих грешака:

Да бисте исправили генерисане грешке симбола не може да се пронађе, уверите се да увозите прави пакет. У коду који је генерисао грешку, класа која је увезена била је Датес. Међутим, не постоји уграђена класа која се зове Датес. Тачан назив је Датум. Стога, да бисте уклонили грешку, увезите датум, а не датуме као што је приказано у наставку:

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

Излаз:

Thu Aug 17 12:02:12 EAT 2023

Утицај грешке: не могу пронаћи симбол у компилацији

Будући да је грешка у компилацији, најнепосреднији утицај грешке симбола не може да се пронађе је неуспех у процесу компилације. Када се Јава компајлира у бајткод, грешке откривене у изворном коду доводе до неуспеха процеса компилације. Према томе, неће бити генерисан бајткод који би се користио у извршавању програма.

Када се такве грешке појаве, очигледан узрок акције је да почнете да отклањате грешке у свом изворном коду да бисте пронашли шта узрокује грешке и исправили грешке. Док отклањање грешака може имати предност да вам помогне да се боље упознате са језиком, то може довести до кашњења у развоју. Поред тога, на укупан квалитет изворног кода утичу грешке у изворном коду.

Закључак

Они не могу да пронађу грешке симбола, што је врло честа грешка, и на њих ћете се сигурно сусрести док пишете Јава код. Срећом, то је такође врло лако избећи грешку. Није могуће пронаћи грешку симбола као резултат погрешне употребе идентификатора. Стога да бисте избегли грешку, уверите се да сте декларисали све своје променљиве, методе и класе пре него што их употребите.

Поред тога, уверите се да не правите грешке у куцању када упућујете на идентификаторе које користите у свом програму и користите све своје идентификаторе у оквиру опсега који сте их декларисали. Коначно, у случају да ћете користити било који пакет или екстерне класе у свом програму, обавезно увезите праве пакете у свој програм пре него што почнете да их користите.

Такође можете истражити најбољи Јава софтвер за праћење за предузећа.