2011-05-13 21 views
7

No tengo una configuración% CLASSPATH% configurada. Según tengo entendido, esto no debería ser un problema porque Javac asumirá un classpath del directorio actual."No se puede encontrar el símbolo" para mi propia clase

Como puede ver a continuación, javac no puede encontrar mi clase Case aunque esté en el mismo directorio exacto. ¿Alguna idea de por qué esto está sucediendo? Este código funciona bien cuando uso Eclipse.

C:\Documents and Settings\joep\My Documents\GCJ\src\codejam2011\Round0\D>dir /B 
Case.class 
Case.java 
EntryPoint.java 

C:\Documents and Settings\joep\My Documents\GCJ\src\codejam2011\Round0\D>javac EntryPoint.java 

EntryPoint.java:16: cannot find symbol 
symbol : class Case 
location: class codejam2011.Round0.D.EntryPoint 
       ArrayList<Case> cases = new ArrayList<Case>(); 
         ^
EntryPoint.java:16: cannot find symbol 
symbol : class Case 
location: class codejam2011.Round0.D.EntryPoint 
       ArrayList<Case> cases = new ArrayList<Case>(); 
                ^
EntryPoint.java:24: cannot find symbol 
symbol : class Case 
location: class codejam2011.Round0.D.EntryPoint 
           cases.add(new Case(new Integer(count), line)); 
              ^
3 errors 

C:\Documents and Settings\joep\My Documents\GCJ\src\codejam2011\Round0\D> 

Actualización 1:

Después de intentar compilar de mi raíz del paquete (src), aparece un nuevo error (incluso después de la eliminación del archivo Case.class)

C:\Documents and Settings\joep\My Documents\GCJ\src>javac -cp . codejam2011/Round0/D/EntryPoint.java 

codejam2011\Round0\D\EntryPoint.java:16: cannot access codejam2011.Round0.D.Case 

bad class file: .\codejam2011\Round0\D\Case.java 
file does not contain class codejam2011.Round0.D.Case 
Please remove or make sure it appears in the correct subdirectory of the classpath. 
       ArrayList<Case> cases = new ArrayList<Case>(); 
         ^
1 error 

C:\Documents and Settings\joep\My Documents\GCJ\src> 

Actualización 2: Parece que está tomando el archivo Case.java de un paquete diferente.

C:\Documents and Settings\joep\My Documents\GCJ\src>javac -d ../classes codejam2011\Round0\D\*.java 

.\codejam2011\Round0\D\Case.java:4: duplicate class: codejam2011.Round0.C.Case 
public class Case 
    ^
codejam2011\Round0\D\EntryPoint.java:16: cannot access codejam2011.Round0.D.Case 

bad class file: .\codejam2011\Round0\D\Case.java 
file does not contain class codejam2011.Round0.D.Case 
Please remove or make sure it appears in the correct subdirectory of the classpath. 
       ArrayList<Case> cases = new ArrayList<Case>(); 
         ^
2 errors 

C:\Documents and Settings\joep\My Documents\GCJ\src> 
+0

¿Importó la clase Case en EntryPoint? – Danish

+0

@ Danish: Eso no es necesario ya que está en el mismo paquete. – BalusC

+0

¿Estudiaste los mensajes de error? 'clase duplicada: codejam2011.Round0.C.Case' Hay C y D - una ambigüedad. Debe excluir algunas importaciones o especificar explícitamente en qué Caso, codejam2011.Round0.C.Case o codejam2011.Round0.D.Case, quiere decir. –

Respuesta

18

Debe compilar desde el paquete raíz, no desde el interior del paquete.

Por lo tanto, cd a la carpeta src y compilar desde allí.

javac -cp . codejam2011/Round0/D/EntryPoint.java 

actualización: según su nuevo problema, es necesario volver a compilar Case.java la misma manera. Al parecer, se compiló de la misma manera incorrecta (desde el interior del paquete).

+0

Obtengo el mismo error exacto cuando configuro classpath en '.' y estoy usando paquetes, ¿quizás por eso no está funcionando? Mi paquete es codejam2011.Round0.D –

+0

He actualizado la respuesta. No esperaba que estuvieras compilando desde el interior del paquete, así no es como debe hacerse. – BalusC

0

Usted está en el directorio incorrecto para compilar.

location: class codejam2011.Round0.D.EntryPoint 

Eso me dice, que su paquete es codejam2011.Round0.D (que está en contra de la convención (en minúsculas), pero no viene al caso ...

cd al directorio padre de codejam2011, que es src, ¿no

javac codejam2011\Round0\D\EntryPoint.java 

podría hacer el truco

menudo tiene un directorio para las clases compiladas, como 'bin' o 'clases' para producir las clases allí, su uso?.. - re (Destino):

javac -d ../classes codejam2011\Round0\D\EntryPoint.java 
+0

Gracias por la sugerencia sobre la convención de paquetes en minúsculas. Lo arreglaré. En cuanto a la compilación, todavía no hay suerte –

+0

¿Cuál es el nuevo error? ¿A qué paquete pertenece Case? ¿Está en el mismo paquete (fácil)? En ningún paquete (: = anónimo, no es posible). ¿Tiene una importación especial para Case? No lo creo. Pruebe 'javac -d ../classes codejam2011 \ Round0 \ D \ *. Java'. –

+0

Case y EntryPoint están en el mismo paquete. (codejam2011.Round0.D) –

1

Si el problema no se resuelve mediante la compilación desde el directorio raíz del paquete (ver las otras respuestas):

  • asegúrese de que todos los archivos de origen contienen clases con los nombres correspondientes a su nombre de archivo
  • asegúrese de que todos los archivos fuente contengan una declaración de paquete correspondiente a su posición en la jerarquía de archivos de origen
  • borre todos sus archivos .class antes de compilar (esto solo debería ser necesario una vez, si marca ed todo lo demás).

Por lo tanto, si el archivo es codejam2011\Round0\D\Case.java, debe contener package codejam2011.Round0.D; como la primera declaración, y luego public class Case { ... }. Además, asegúrese de que no haya otro archivo fuente que contenga este paquete y declaración de clase.

En su mensaje de error, parece que la instrucción del paquete es package codejam2011.Round0.C; en su lugar (y también tiene una clase Case en el paquete real codejam2011.Round0.C).

Cuestiones relacionadas