Что вызывает эту ошибку Java "Не удается найти символ"?

Я изменяю унаследованный код и продолжаю получать странную ошибку "не могу найти символ", которая сбивает меня с толку.

   //======= Error =========

Compiling 1 source file to /Users/Inprimus/Projects/Workspace/Soft/build/web/WEB-INF/classes
/Users/Inprimus/Projects/Workspace/Soft/WebContent/WEB-INF/classes/fr/service/CarPeer.java:49: cannot find symbol
symbol : method addCarToCompany(java.lang.Long,fr.model.company.Car)
location: class fr.dao.CompanyDAO
cmpDAO.addCarToCompany(idCompany,car);
^
1 error

Авто сверстники:

package fr.service;    
import fr.model.company.Car;
import fr.dao.CompanyDAO;
import fr.dao.CarDao;

public class CarPeer {
    private static CarDao carDAO= new CarDao();
    private static CompanyDAO cmpDAO = new CompanyDAO();

    public static void storeCar(Long idCompany, Car car) throws UserServiceException, Exception {
        try {
            cmpDAO.addCarToCompany(idCompany,car);
            System.out.println("Car stored : "+car.toString()+" in "+idCompany);
            carDAO.storeCar(car);
        } catch(DAOException ex) {
            throw new UserServiceException(ex.getMessage(), ex);
        }
    }
}

CompanyDao:

   package fr.dao;
    import fr.model.accounting.Cost;
    import fr.model.company.Car;

    public class CompanyDAO extends GenericDAO<Company> {

    private enum ChildType {
    COST{
    public void addChildToCompany(Company company, Object child) {
    company.addCost((Cost)child);
    }
    },
    CAR{
    public void addChildToCompany(Company company, Object child) {
    company.addCar((Car)child);
    }
    };
    public abstract void addChildToCompany(Company company, Object child);
    }
private void addChildToCompany(Long idCompany, Object child, ChildType type) throws NotFoundDAOException, AlreadyExistDAOException, Exception {
        try {
            // Begin unit of work
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();

            Company company = (Company) session.load(Company.class, idCompany);

            type.addChildToCompany(company, child);
            session.flush();

            // End unit of work
            session.getTransaction().commit();

        } catch (ObjectNotFoundException ex) {
            HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
            throw new NotFoundDAOException("Identified object " + idCompany
                    + " doesn't exist in database", ex);
        } catch (ConstraintViolationException ex) {
            HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
            throw new AlreadyExistDAOException("The new identity already exsits in database", ex);
        } catch (Exception ex) {
            ex.printStackTrace();
            HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
            throw new Exception(ex);
        }
    }
    public CompanyDAO() {
    super(Company.class);
    }
    public void addCarToCompany(Long idCompany, Car car) throws NotFoundDAOException, AlreadyExistDAOException, Exception {
    addChildToCompany(idCompany, car, ChildType.CAR);
    }
    }

Я проверил трижды, но пока не могу найти ничего плохого в коде. Я собираю его в Netbeans 7.0.1. Я должен упомянуть, что я получаю эту ошибку при сборке, но я могу запустить веб-приложение без каких-либо проблем (пока). Но я боюсь, что это может вернуться, чтобы укусить сзади.


Я только что заметил в дереве файлов, что над классами CompanyDAO названы файлы с одинаковыми именами, имеющие формат: CompanyDAO$ChildType#.class (# соответствует числу). Я предполагаю, что он не перекомпилировал класс для генерации дополнительного Тип ребенка я добавил. Как я могу повлиять на это?

6 ответов

Решение

CompanyDao компилируется и доступен на classpath до CarPeer?

Скорее всего, вы используете ранее скомпилированный файл класса (у которого не было метода) в вашем пути к классам, и система пытается использовать его вместо вашего текущего исходного кода.

В противном случае очистите рабочее пространство, не зависите от существующих компиляций и попробуйте снова. Это случилось со мной в прошлом.

У меня все та же проблема (хотя я не знаю, по той же ли причине). Для меня единственное, что работает (кроме отключения этой "надежной" IDE) - это удаление кеша. На окнах он расположен в %UserProfile%\.netbeans\7.0\var\cache, Я полагаю, на * NIX, это может быть под ~/.netbeans/7.0/var/cache, Сначала необходимо выйти из NetBeans, удалить кэш, а затем снова запустить NetBeans.

Очистите и постройте свой проект. Если это не сработает, перезапустите Netbeans. Иногда NetBeans выдает странные ошибки, и полный перезапуск NetBeans и / или компьютера, по-видимому, устраняет эти необъяснимые проблемы.

Это может быть проблемой, потому что текущий экземпляр NetBeans, который вы используете, использует ранее созданный кеш во время его инициализации. Итак, чтобы очистить кеш netbeans, вы можете выполнить любой из этих двух шагов, упомянутых ниже.

ПОДХОД 1
1. щелкните правой кнопкой мыши на имени вашего проекта в NetBeans на вкладке проектов.
2. нажмите на опцию очистки и сборки.
3. Кеш очищен.

ПОДХОД 2
1. Нажмите "Windows + R" и введите "% UserProfile% / appdata / local / netbeans".
2. Перейдите в папку кеша, а затем в папку с именем, указав версию NetBeans.
3. Закройте NetBeans и удалите все файлы, присутствующие в папке.
4. Перезапустите netbeans, и теперь вы сможете увидеть имя класса.

Если какой-либо из этих методов не работает, возможно, ваш путь к классу неверен.

При использовании Netbeans 7.2+ выполните следующие действия:

  • Закройте все вкладки и выйдите из Netbeans;
  • Удалить каталог кеша: ~/.cache/netbeans/VERSION. Где VERSION - версия Netbeans, то есть 7.3.1.
  • Перезапустите NetBeans и "Очистить и построить"

Также смотрите Как очистить кэш в NetBeans

Другие вопросы по тегам