Как исправить ошибку компиляции java: cannot find symbol symbol:?
В общем и целом:
пишу учебный банковский сервис, который рассчитывает проценты по кредиту. Более чем уверен, что ошибка в самом построении моего кода, а как исправить его я не понимаю. помогите кто чем может.
@Override public CreditDTO statement(CreditDTO creditDTO)< CreditEntity creditDtoFromEntity = CreditMap.INSTANCE.toEntity(creditDTO); CreditEntity creditEntity = new CreditEntity();//кредит creditEntity.setLimit(creditDtoFromEntity.getLimit());//Сумма необходимая клиенту creditEntity.setPercent(creditDtoFromEntity.getPercent());//проценты creditEntity.setMonths(creditDtoFromEntity.getMonths()); // кол-во месяцев creditEntity.getBankEntity().setId(BankMap.INSTANCE.toEntity(creditDTO.getBankDTO()).getId());// id банка creditEntity.getClientEntity().setId(ClientMap.INSTANCE.toEntity( creditDTO.getClientDTO()).getId());// id клиента CreditEntity save = creditRepo.save(creditEntity); return CreditMap.INSTANCE.toDto(save); >
@Override public OfferDTO registration(OfferDTO offerDTO) < OfferEntity offer = new OfferEntity();// новое КП CreditEntity creditEntity = CreditMap.INSTANCE.toEntity(statement(offerDTO.getCreditDTO())); offer.setCreditId(creditEntity.getId()); offer.setClientId(creditEntity.getClientEntity().getId()); int oneРundredPercent = 100; offer.setClientId(offer.getClientId());//id клиента вписываем вручную, раз уж спринг секьюрити нет. offer.setPaymentDate(new Date());//дата платежа offer.setSum(creditEntity.getLimit()+creditEntity.getLimit()/oneРundredPercent*creditEntity.getPercent());//сумма+проценты offer.setSumPay(offer.getSum()/creditEntity.getMonths()); //месячный платёж offer.setSumPayDeposit(creditEntity.getLimit()/creditEntity.getMonths()); //гашение задолжности без процентов offer.setSumPayPercent(offer.getSumPay()-offer.getSumPayDeposit());//гашение процентов OfferEntity save = offerRepo.save(offer); return OfferMap.INSTANCE.toDto(save); >
C:\Users\Дмитрий\Desktop\bank\src\main\java\com\example\demo\service\impl\CalculateServiceImpl.java:32:50 java: cannot find symbol symbol: method getLimit() location: variable creditDtoFromEntity of type com.example.demo.model.entity.CreditEntity
- Вопрос задан более двух лет назад
- 1811 просмотров
4 комментария
Простой 4 комментария
Сергей Горностаев @sergey-gornostaev Куратор тега Java
Полный текст ошибки добавьте в вопрос.
Сергей Горностаев @sergey-gornostaev Куратор тега Java
Теперь покажите код CreditEntity.
Дмитрий Волокитин @Dima_gogi_ya Автор вопроса
package com.example.demo.model.entity; import lombok.Data; import javax.persistence.*; import java.util.List; @Entity @Table(name = "credit") @Data public class CreditEntity
Сергей Горностаев @sergey-gornostaev Куратор тега Java
Дмитрий Волокитин, похоже, Орхан Гасанлы вам правильно подсказал, что Lombok не генерирует аксессоры.
Решения вопроса 0
Ответы на вопрос 1
Орхан Гасанлы @azerphoenix Куратор тега Java
Java Software Engineer
Добрый день!
Обратите внимание, что у вас в консоли все геттеры выпадают с ошибкой. Это бывает из-за ошибок при использовании библиотеки lombok.
Например, в IDEA не установлен плагин lombok или например, для данного проекта не включена annotation processing
Ответ написан более двух лет назад
Нравится 1 2 комментария
Дмитрий Волокитин @Dima_gogi_ya Автор вопроса
Другой проект на том-же стеке работает. Но я всё-же проверил настройки. Всё в порядке.
Орхан Гасанлы @azerphoenix Куратор тега Java
Дмитрий Волокитин,
увидел ваш класс CreditEntity.
Есть еще одна идея почему это может происходить.
Если вкратце, то некоторые названия зарезервированы в SQL. Например, limit
375 слово — https://www.drupal.org/docs/develop/coding-standar.
Предположу, что при создании entity данная колонка в БД не создается. Отсюда и ошибка.
Чтобы исключить ошибку в CreditEntity измените на:
@Column(name = "`limit`") int limit;
Обратите внимание, что в name я указал название limit с символом backtick
https://vladmihalcea.com/escape-sql-reserved-keywo.
Или же можете в properties || yml прописать:
hibernate.globally_quoted_identifiers=true
https://stackoverflow.com/questions/2224503/how-to.
P.S. Слово percent тоже зарезервировано (522 слово — https://www.drupal.org/docs/develop/coding-standar. )
Скорее всего его тоже нужно экранировать
Правда, это список зарезервированных слов отличается в зависимости от используемой БД.
Как исправить ошибку «error cannot find symbol»?
Только начал учиться программированию. При компиляции файла Main.java выходит ошибка error cannot find symbol . Если я правильно понял, то он не взаимодействует с Person.java , а пытается выполнить всё в Main.java . Но как мне это решить? Всё ещё никак не могу понять. Main.java:
public class Main < public static void main(String[] args) < Person dima = new Person(); System.out.println(dima.height); >>
Person.java:
public class Person
Ошибка:
E:\study\java> javac Person.java E:\study\java> javac main.java main.java:3: error: cannot find symbol Person dima = new Person(); ^ symbol: class Person location: class main main.java:3: error: cannot find symbol Person dima = new Person(); ^ symbol: class Person location: class main 2 errors
Отслеживать
9,042 4 4 золотых знака 19 19 серебряных знаков 28 28 бронзовых знаков
задан 13 янв 2020 в 10:58
23 1 1 золотой знак 1 1 серебряный знак 3 3 бронзовых знака
Пожалуйста запустите в терминале echo %CLASSPATH% и пришлите что вывелось
13 янв 2020 в 12:17
Мне кажется, что в классе main не хватает импорта. Попробуйте добавить в начало import Person
13 янв 2020 в 12:40
Привет, можете почитать здесь pro-java.ru/java-dlya-nachinayushhix/import-paketov-v-java что указание import необязательно если используется полное имя класса, которое в нашем случае и есть Person , так что ошибка не в этом.
13 янв 2020 в 12:46
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Такое поведение скорее всего связано с переменной %CLASSPATH% в которой перечислены папки где javac будет искать .class файлы для компиляции. По умолчанию эта переменная окружения не задана и тогда javac ищет .class файлы только в текущей папке.
Скорее всего у вас эта переменная была задана ранее (можно проверить при помощи echo %CLASSPATH% ) и тогда текущую папку нужно указывать вручную, например через
javac main.java --class-path .
( . означает текущую директорию)
Если не хочется каждый раз вручную указывать —class-path . можно очистить %CLASSPATH% при помощи set CLASSPATH=
Обратите внимание что необязательно даже вызывать javac Person.java , компилятор автоматически скомпилирует Person.java
Вот пример запуска на моем компьютере (у меня линукс поэтому синтаксис немного отличается)
~/Workspace$ export CLASSPATH= ~/Workspace$ echo $CLASSPATH ~/Workspace$ javac Person.java ~/Workspace$ javac main.java ~/Workspace$ java main 189 ~/Workspace$ export CLASSPATH=/somedirectory ~/Workspace$ echo $CLASSPATH /somedirectory ~/Workspace$ javac Person.java ~/Workspace$ javac main.java main.java:3: error: cannot find symbol Person dima = new Person(); ^ symbol: class Person location: class main main.java:3: error: cannot find symbol Person dima = new Person(); ^ symbol: class Person location: class main 2 errors ~/Workspace$ javac main.java --class-path . ~/Workspace$ java main 189
Как исправить error: cannot find symbol?
Добрый день
Там же черным по белому написано, что он не может найти символ num
System.out.println(«Amoeba №: » + num + «:»);
Переменная у вас объявлена внутри публичного класса и недоступна в самом методе.
int num = Amount;
Прочитайте про область видимости переменной
Ответ написан более двух лет назад
Нравится 2 6 комментариев
lerny @lerny Автор вопроса
Почитал про зоны видимости. Исправил код и все работает:
public class Evolution < public static void main(String[] args) < Amoeba a1 = new Amoeba(5); a1.setChromosomes(5); a1.infoAmoeba(a1.num); >> class Amoeba < static int Amount; static boolean established = false; final public int num; public Amoeba(int n) < if (established) < Amount += 1; >else < Amount = n; >established = true; num = Amount; > private int Chromosomes; public void setChromosomes(int x) < Chromosomes = x; >public void infoAmoeba(int num) < System.out.println("Amoeba №: " + num + ":"); if (Chromosomes == 0) < System.out.println("Chromosomes: unknown " + "; " + "Amount: " + Amount + ";"); >else < System.out.println("Chromosomes: " + Chromosomes + "; " + "Amount: " + Amount + ";"); >> >
Но не уверен, что это хороший способ, если вас не затруднит, посоветуйте как правильно.
lerny, способ чего? соединять строки? нормально
lerny @lerny Автор вопроса
Jacen11, то как я исправил ошибку с num
Орхан Гасанлы @azerphoenix Куратор тега Java
lerny, не очень понимаю надобность одного из этих переменных:
final public int num; static int Amount;
с учетом того, что вы все равно присваиваете
num = Amount;
Если это реализовано логично в вашем коде, то все ок
Ошибка компиляции «Can not Find Symbol» в Java
Ошибки «Не удается найти символ» обычно возникают, когда вы пытаетесь ссылаться на необъявленную переменную в коде. Ошибка «Не удается найти символ» означает, что компилятор не может этого сделать. Ваш код, похоже, ссылается на то, что компилятор не понимает.
Когда ваш код компилируется, компилятору необходимо выяснить, что означает каждый идентификатор вашего кода. Когда компилятор просматривает код, он найдет что-то и знает, что с ним делать или нет. Ошибка «Не удается найти символ» относится к идентификаторам и означает, что Java не может понять, что означает «символ».
Пример
public class TestClass < public static void main(String[] args) < int x = 2; int y = 4; sum = x + y ; System.out.println(sum); >>
Выход
TestClass.Java:10: error: cannot find symbol sum = x + y ; symbol: variable sum location: class TestClass TestClass.Java:11: error: cannot find symbol System.out.println(sum); symbol: variable sum location: class TestClass 2 errors
В приведенном выше коде переменная сумма не была объявлена, вам нужно сообщить компилятору, каков тип суммы; например:
int sum = x + y ;
Общими причинами ошибки «Не удается найти символ» являются такие вещи, как:
Общими причинами ошибки «Не удается найти символ» являются такие вещи, как.