什么导致了Java中的“找不到符号”错误?

8
我在修改继承的代码时不断出现一个奇怪的“找不到标记”错误,这让我感到困惑。
   //======= 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中构建它。值得一提的是,当我构建时,我会收到此错误,但我可以无任何问题地运行Web应用程序(但目前为止)。但我担心这可能会在以后带来麻烦。
我刚刚注意到,在CompanyDAO类的文件树中,上面有一些类似命名的文件,格式为:CompanyDAO$ChildType#.class(#对应一个数字)。我猜它没有重新编译类以生成我添加的额外子类型。我该如何处理?

尝试清理项目/执行完整重建了吗? - solendil
1
你尝试过进行一次干净的构建吗?你的类路径中是否有一个JAR文件或另一个文件夹,可能也有CompanyDAO类的副本? - gkamal
6个回答

6

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

否则,请清理您的工作区,不要依赖现有的编译,并重试。我过去也遇到过这种情况。


我会尝试清理工作区,你可能是对的。但是这个类是我自己从头编写的。整个包(和 Web 应用程序也是克隆的)。 - Dark Star1
除非有一种方法可以清理工作区,否则不行。我也看不到在项目属性中删除依赖项的位置。 - Dark Star1
不行,我做的任何事情似乎都无法摆脱这个错误。也许可以尝试使用eclipse看看是否可以利用它的构建工具。 - Dark Star1

5

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


在NetBeans 8.0.2中,缓存不会出现在同一位置。我在%UserProfile%\AppData\Local\NetBeans\Cache中找到了一个缓存,也许它是同一个。 - m3z

3

在 CarPeer 之前,CompanyDao 是否已经被编译并在类路径上可用?


@DarkStar1 请检查您的构建路径或源路径,或者无论NetBeans称之为什么。 - Mark
我必须在 Eclipse 中打开项目,并使用构建工具解决问题。它成功编译了所有内容。 - Dark Star1

2

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


1
使用Netbeans 7.2+时,请按照以下步骤操作:
  • 关闭所有选项卡并退出Netbeans;
  • 删除缓存目录:~/.cache/netbeans/VERSION。其中VERSION是Netbeans版本,例如7.3.1;
  • 重新启动Netbeans并进行“清理和构建”。

另请参阅如何清除NetBeans中的缓存

更新(2021年1月)

仍适用于Netbeans 12.2。

当使用snap安装Netbeans时,要删除/清理的目录为:~/snap/netbeans/common/cache


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

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接