martes, 15 de marzo de 2011

"cannot find symbol", error al compilar

Cuando empezamos a aprender Java un error muy común al compilar desde DOS es que nos encontramos con errores en la compilación y no sepamos como resolverlo. Por ejemplo un de ellos se produce cuando en una clase creamos un objecto a partir de otra clase.

Por ejemplo teniendo estas dos clases, una es Leer.java y la otra Leer3.java que crea el objeto de la case Leer.java:

//Clase Leer.java
import java.io.*;

import java.util.Scanner;

public class Leer{

public String Leer()
{

return porTeclado();

}


public String porTeclado()


{


Scanner leer = new Scanner(System.in);


String cadena = leer.next();


return cadena;


}


}



//Clase Leer3.java

public class Leer3


{


public static void main(String args[])


{


Leer vleer = new Leer();


String cadena = vleer.porTeclado();


System.out.println("Texto leido : " + cadena);


}


}



Partimos de que los dos archivos están guardados en el siguiente directorio:

C:\cursojava\modulor4\practica4\Leer.java

C:\cursojava\modulor4\practica4\Leer3.java



Al compilar las clases según se muestra a continuación, vemos que nos genera un error de "cannot find symbol", en la compilación de la clase Leer3.java, cuando la compilación de la clase Leer.java no ha generado ningún problema.

C:\cursojava>javac modulo4/practica4/Leer.java

C:\cursojava>javac modulo4/practica4/Leer3.java

modulo4\practica4\Leer3.java:6: cannot find symbol


symbol : class Leer


location: class Leer3


Leer vleer = new Leer();


^


modulo4\practica4\Leer3.java:6: cannot find symbol


symbol : class Leer


location: class Leer3


Leer vleer = new Leer();

^

2 errors



El problema es debido a que la clase Leer3 necesita crear el el objecto de la clase Leer pero el compilador desconoce donde se encuentra almacenada dicha clase. Para ello debemos agrupar estas dos clases en un paquete PACKAGE, esta clave la deberemos indicar al principio de cada una de las clases para evitar el error. Hay que tener en cuenta la clave del paquete debe mantener la misma estructura de directorios donde están almacenadas las clases.

Según hemos visto en el ejemplo las clases deberían quedar de la siguiente manera:

//Clase Leer.java

package modulo4.practica4;

import java.io.*;

import java.util.Scanner;


public class Leer{


public String Leer()

{

return porTeclado();

}

public String porTeclado()

{

Scanner leer = new Scanner(System.in);

String cadena = leer.next();

return cadena;

}

}



//Clase Leer3.java

package modulo4.practica4;

public class Leer3


{


public static void main(String args[])


{


Leer vleer = new Leer();


String cadena = vleer.porTeclado();


System.out.println("Texto leido : " + cadena);


}


}


NOTA: También afecta la configuración de la variable de entorno CLASSPATH que para este ejemplo su valor es: c:\Java\jdk1.6.0_23\lib;c:\cursojava