是什么导致这个Java“无法找到符号”错误?

时间:2011-11-28 16:20:51

标签: java netbeans-7

我正在修改继承的代码并继续得到一个奇怪的“无法找到符号”错误,这会让我失望。

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

公司道:

   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中构建它。我应该提到我在构建时遇到此错误,但我可以运行Web应用程序而没有任何问题(尚未)。但我担心这可能会在后面咬回来。


我刚刚在文件树中注意到,在CompanyDAO类上面是类似命名的文件,其格式为:CompanyDAO $ ChildType#.class(#对应一个数字)我猜它没有重新编译类到生成我添加的额外子类型I.我怎么能影响到这个?

6 个答案:

答案 0 :(得分:6)

您很可能在类路径中使用以前编译的类文件(没有该方法),系统正在尝试使用它而不是您当前的源代码。

否则,请清理工作区,不要依赖现有编辑,然后重试。这在过去发生在我身上。

答案 1 :(得分:4)

我一直有同样的问题(虽然我不知道是否出于同样的原因)。对我来说,唯一有效的方法(除了放弃这个“强大的”IDE)就是删除缓存。在Windows上,它位于%UserProfile%\.netbeans\7.0\var\cache。我想在* nix上,它可能在~/.netbeans/7.0/var/cache之下。您必须先退出NetBeans,删除缓存,然后再次启动NetBeans。

答案 2 :(得分:2)

清理并构建您的项目。如果这不起作用,那么重新启动Netbeans。有时Netbeans会出现奇怪的错误,并且Netbeans和/或计算机的完全重启似乎解决了这些无法解释的问题。

答案 3 :(得分:2)

在CarPeer之前,是否已在类路径上编译和提供CompanyDao?

答案 4 :(得分:1)

使用Netbeans 7.2+时,请执行以下操作:

  • 关闭所有标签并退出Netbeans;
  • 删除缓存目录:〜/ .cache / netbeans / VERSION。 VERSION是Netbeans版本,即7.3.1
  • 重新启动Netbeans并“清理并构建”

另见How to clear the Cache in NetBeans

答案 5 :(得分:1)

这可能是问题,因为您正在运行的当前netbeans实例在其初始化期间正在使用先前的构建缓存。因此,为了清除netbeans缓存,您可以执行下面提到的这两个步骤中的任何一个。

方法1
1.在项目选项卡中右键单击netbeans中的项目名称。
2.单击清理并构建选项。
3.缓存已被清除。

方法2
1.单击“Windows键+ R”并键入“%UserProfile%/ appdata / local / netbeans”。
2.导航到缓存文件夹,然后导航到名称指定netbeans版本的文件夹。
3.关闭Netbeans并删除文件夹中的所有文件。
4.重新启动netbeans,现在您将能够看到类名。

如果这些方法中的任何一个都不起作用,则可能是您的类路径不正确。