2011-11-28 67 views
6

我正在修改继承的代码,并不断得到一个奇怪的“无法找到符号”的错误,这是抛出我。什么导致此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中构建它。我应该提到我在构建时遇到此错误,但是我可以在没有任何问题(但)的情况下运行该Web应用程序。但我担心这可能会回来咬在后面。


我只注意到,该CompanyDAO类以上的类似名称的文件带有格式文件树:CompanyDAO $ ChildType#的.class(#对应的数字)我猜它没有重新编译该类以生成额外的添加的类型I。我怎样才能做到这一点?

+0

试图清理项目/执行完整的重建? – solendil

+1

你试过干净的版本吗?你在classpath中是否有一个jar或其他文件夹,可能还有一个CompanyDAO类的副本? – gkamal

回答

2

CompanyDao是否在CarPeer之前编译并可用于类路径?

+1

说实话我不确定 –

+0

@ DarkStar1看看构建路径或源路径或NetBeans称之为的任何顺序。 – Mark

+0

我必须在Eclipse中打开项目并使用构建工具来解决问题。它正确地编译了一切。 –

6

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

否则,清理您的工作区,不要依赖于现有的编译并重试。这在过去发生在我身上。

+0

我会尝试清理工作区,你也许是正确的。但我从头开始编写这门课。整个包(和webapp是一个克隆) –

+0

Nope除非有办法清理工作空间,我也看不到在项目属性中删除依赖关系 –

+0

Nope。我所做的一切似乎都无法摆脱这个错误。可能会尝试使用eclipse,看看我是否可以使用它的构建工具 –

1

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

4

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

+0

在netbeans 8.0.2中缓存不会出现在同一个地方。我确实在%UserProfile%\ AppData \ Local \ NetBeans \ Cache中找到了缓存 也许它是一样的。 – m3z

1

当使用NetBeans 7.2+做到以下几点:

  • 关闭所有标签并退出Netbeans的;
  • 删除缓存目录:〜/ .cache/netbeans/VERSION。其中version是Netbeans的版本,即7.3.1
  • 重启Netbeans和“清洁&构建”

另见How to clear the Cache in NetBeans

0

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

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

APPROACH 2
1.点击 “窗口键+ R” 和类型 “%USERPROFILE%/ APPDATA /本地/ netbeans的”。
2.导航到缓存文件夹,然后导航到名称指定netbeans版本的文件夹。
3.关闭Netbeans并删除文件夹中的所有文件。
4.重新启动netbeans,现在您将能够看到类名。

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