Java - POO: ¿Qué significa 'Cannot be resolved to a type' y cómo solucionarlo?

 
Vista:
sin imagen de perfil

POO: ¿Qué significa 'Cannot be resolved to a type' y cómo solucionarlo?

Publicado por Darío Chávez Ibarra (2 intervenciones) el 13/07/2022 10:48:49
Hola. Buenos días, tardes o noches. Soy nuevo programando y estoy lidiando con Programación orientada a objetos. Busqué en línea problemas que resolver para practicar con mi conocimiento, pero topé con un muro.

Estoy desarrollando un programa donde debo hacer una clase llamada 'Cuenta'. En ella, debo incluir dos atributos, 'Titular', que es un String, y 'Cantidad', que es un double. Con estos datos, debo crear un constructor que contenga ambas variables. A dicho constructor, se le puede agregar una cantidad determinada de dinero, o se le puede retirar determinada cantidad de dinero. Asimismo, se le puede asignar el nombre a la cuenta.

Lo "complicado" creo tenerlo bien, pero, por algún motivo, a la hora de crear un objeto de la clase 'Cuenta', la terminal me arroja el problema 'Cuenta cannot be resolved to a type'. Si alguien me pudiera ayudar, se lo agradecería muchísimo.



(Codifico en Visual Studio Code)
(Aquí la descripción del problema...:

"1) Crea una clase llamada Cuenta que tendrá los siguientes atributos: titular y cantidad (puede tener decimales).

El titular será obligatorio y la cantidad es opcional. Crea dos constructores que cumpla lo anterior.

Crea sus métodos get, set y toString.

Tendrá dos métodos especiales:

- ingresar (double cantidad): se ingresa una cantidad a la cuenta, si la cantidad introducida es negativa, no se hará nada.

- retirar (double cantidad): se retira una cantidad a la cuenta, si restando la cantidad actual a la que nos pasan es negativa, la cantidad de la cuenta pasa a ser 0.
")
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

POO: ¿Qué significa 'Cannot be resolved to a type' y cómo solucionarlo?

Publicado por Kabuto (1381 intervenciones) el 13/07/2022 11:51:48
Tu principal problemas es que el archivo donde has escrito la clase Cuenta, no tiene extensión.
Está guardado simplemente como "Cuenta", cuando debería estar guardado como "Cuenta.java"

Renómbralo para añadirle la extensión .java.


A parte de eso, hay otros fallos-

Al declarar los atributos, estás inicializando el atributo titular con comillas simples.
1
2
3
4
5
public class Cuenta
{
    //  Declaracón de atributos...
    String Titular = '';
    double Cantidad = 0.0;

No es correcto, ha de inicializarse con comillas dobles
1
2
3
4
5
public class Cuenta
{
    //  Declaracón de atributos...
    String Titular = "";
    double Cantidad = 0.0;

Otro problema, estás poniendo los nombres de los atributos con la primera letra en mayúscula.
Esto no es un error, y el compilador Java te lo dará por bueno. Pero no es la costumbre correcta dentro del lenguaje Java.
Se recomienda escribir siempre en minúsculas los nombres de variables (un atributo es una variable) y también los nombre de métodos y procedimientos/funciones.
Solo escribiremos con la primera letra en mayúscula, los nombres de las clases: Cuenta, String, Main,...

No seguir estar recomendaciones, luego puede provocar fallos como el que te ocurre en el constructor:
1
2
3
4
5
6
7
8
9
10
11
12
13
    // Creación de constructor 'Cuenta'...
    public Cuenta (String Titular, double Cantidad)
    {
        this.Titular = Titular;
        if (Cantidad < 0)
        {
            this.cantidad = 0;
        }
        else
        {
            this.cantidad = cantidad;
        }
    }

Ahí, unas veces llamas al atributo cantidad con la primera letra en mayúscula, y otras veces no.
Eso el compilador va a considerar como dos variables distintas, y te lanzará error de que no sabe de donde ha salido esa variable "cantidad" en minúscula, ya que el solo conoce la que se ha declarado en mayúscula.
Para evitar esto, y cumplir con los usos y costumbres de Java, mejor escribir todas las variables en minúscula.


Otro error, los métodos setter's que has escrito no son correctos. Los setters lo que hacen es establecer un valor a los atributos. Ese valor se ha de recibir como argumento entre los paréntesis del método, pero tú no has indicado que vayan a recibir nada, ya que has dejado los paréntesis vacíos.

1
2
3
4
5
6
7
8
public void setTitular ()
    {
        this.titular = titular;
    }
    public void setCantidad ()
    {
        this.cantidad = cantidad;
    }

Para que los setter's cumplan con su función, hay que indicar el argumento que van a recibir cada uno:
1
2
3
4
5
6
7
8
public void setTitular(String titular)
    {
        this.titular = titular;
    }
    public void setCantidad(double cantidad)
    {
        this.cantidad = cantidad;
    }

Vamos a ver ahora los métodos de ingresar y retirar.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public ingresar(double cantidad)
    {
        if (this.cantidad > 0)
        {
            this.cantidad += cantidad;
        }
    }
 
    public retirar(double cantidad)
    {
        if (this.cantidad - cantidad < 0)
        {
            this.cantidad = 0;
        }
        else
        {
            this.cantidad -= cantidad;
        }
    }
Para empezar, tenemos un error de sintaxis. No has puesto qué tipo de dato van a retornar esos dos métodos.
Un método SIEMPRE ha de retornar algo. Muchas veces en realidad no vamos a necesitar que haga ningún tipo de retorno, pero es una obligación retornar "algo".
Es en esos casos es cuando usamos la palabra reservada "void" para indicar que va a hacer un retorno "vacío".
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void ingresar(double cantidad)
    {
        if (this.cantidad > 0)
        {
            this.cantidad += cantidad;
        }
    }
 
    public void retirar(double cantidad)
    {
        if (this.cantidad - cantidad < 0)
        {
            this.cantidad = 0;
        }
        else
        {
            this.cantidad -= cantidad;
        }
    }

Ok, sintaxis corregida.
Pero ahora tenemos un error de lógica en el método ingresar().

La premisa es añadir una cantidad al saldo de la cuenta, pero nos dicen que si la cantidad para añadir es un valor negativo, entonces no hacemos nada.
Tú esto lo estás evaluando mal, porque lo que estás preguntando es si la cantidad de ESTA(this) cuenta es positiva:
1
2
3
4
5
6
7
public void ingresar(double cantidad)
    {
        if (this.cantidad > 0)
        {
            this.cantidad += cantidad;
        }
    }

Cuando en realidad esa pregunta tienes que hacerla sobre la cantidad que se recibe como argumento:
1
2
3
4
5
6
7
public void ingresar(double cantidad)
    {
        if (cantidad > 0)
        {
            this.cantidad += cantidad;
        }
    }


Hemos pasado una cosa por alto.

El enunciado nos pide DOS constructores. Nos dice que el atributo "titular" es obligatorio siempre, es decir, todo objeto Cuenta construido ha de recibir un valor para titular.
Sin embargo, el atributo "cantidad" no es obligado, si no opcional.
Así que debemos ofrecer dos constructores, uno donde solo se pida el titular, y otro donde se pidan ambos valores para los atributos.

Por cierto, sobre la inicialización de los atributos. Lo normal es que esto se haga dentro de los constructores y no en la línea donde se declaran.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Cuenta
{
    //  Declaracón de atributos...
    String titular;
    double cantidad;
 
    // Constructores de Cuenta
    public Cuenta(String titular) { //Solo pedimos titular
    	this.titular = titular;
    	cantidad = 0.0;
    }
 
    public Cuenta(String titular, double cantidad) //Pedimos titular y cantidad
    {
        this.titular = titular;
        if (cantidad < 0)
        {
            this.cantidad = 0;
        }
        else
        {
            this.cantidad = cantidad;
        }
    }



Con todos estos cambios, ya podemos probar la clase en el Main.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main
{
    public static void main (String [] Yoshi)
    {
        //  Crear objeto basandose en clase 'Cuenta'...
        Cuenta cuenta1 = new Cuenta ("Darío Chávez Ibarra", 500);
 
        // Utilizart métodos en la clase 'Cuenta'...
        cuenta1.ingresar(500.50);
        cuenta1.retirar(200.00);
 
        //  Imprimir información de 'Cuenta1'...
        System.out.println(cuenta1);
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

POO: ¿Qué significa 'Cannot be resolved to a type' y cómo solucionarlo?

Publicado por Darío (2 intervenciones) el 14/07/2022 03:06:53
Te agradezco muchísimo tu muy elaborada respuesta. Es gracias a programadores como tú que me siento motivado a no dejar atrás este sueño mío de convertirme en un gran programador.

He solucionado los problemas que tenía y, asimismo, he aprendido varias cosas, aunque me he quedado con una cuestión sin resolver. Comprendo masómenos el prinicipio de la instrucción '.this', pero necesito solventar mi duda: cuando se utiliza dicha instrucción, ¿a qué variable se está haciendo referencia? ¿a la variable declarada como 'String titular' en la línea de código cinco, o a la variable declarada dentro del método? De ahí en fuera, me ha quedado claro todo. No sabía sobre el uso del void, por ejemplo. Gracias por ayudarme a aclarar esa cuestión también.

Muchas gracias, en general.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

POO: ¿Qué significa 'Cannot be resolved to a type' y cómo solucionarlo?

Publicado por Kabuto (1381 intervenciones) el 14/07/2022 10:30:03
Cuando usamos this, hacemos referencia al atributo de la clase (sí, la que está en la línea 5).
Se usa para que el compilador de Java no se confunda en el caso de que los nombres de las variables que recibimos entre paréntesis (argumentos) tanto en constructores como métodos, coincidan con el nombre de los atributos.

Mira este sencillo ejemplo

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Persona {
 
    //Atributos de la clase Persona
    private String nombre;
    private int edad;
 
    //Constructor de clase Persona
    public Persona(String nuevoNombre, int nuevaEdad) {
        nombre = nuevoNombre;
        edad = nuevaEdad;
    }
 
}

En este caso, el constructor recibe dos argumentos cuyos nombres NO coinciden con los de los atributos. Así que aquí no hay confusión posible y NO es necesario usar la palabra reservada this.
Podría usarse, de hecho mucha gente prefiere usarla siempre, pero no es imprescindible.
Por lo que el compilador aquí no tendrá problemas, entiende perfectamente que lo que le pedimos es que asigne los valores de las variables recibidas a los atributos de la clase.

Pero, ¿qué pasa si hemos decidido que los nombres de argumentos y atributos sean iguales?

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Persona {
 
    //Atributos de la clase Persona
    private String nombre;
    private int edad;
 
    //Constructor de clase Persona
    public Persona(String nombre, int edad) {
        nombre = nombre;
        edad = edad;
    }
 
}

Aquí el compilador sí que no va a interpretar bien nuestros deseos. Cuando los nombres de atributos y variables/argumentos son iguales, si no indicamos nada, el compilador da preferencia a los argumentos.
Así que en este constructor, el compilador lo que va a hacer es asignar el valor de los argumentos, a esos mismos argumentos...
Lo cuál es absurdo porque no sirve para nada, y encima los atributos quedarían sin recibir ningún valor.

Es en estos casos donde sí es necesario usar la palabra this, para que el constructor sepa cuándo nos referimos a los atributos de ESTA(this) clase y cuándo no:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Persona {
 
    //Atributos de la clase Persona
    private String nombre;
    private int edad;
 
    //Constructor de clase Persona
    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }
 
}

En el caso de métodos setter's, ocurre exactamente lo mismo. Si argumento y atributo se llaman igual, imprescindible usar this para que todo funcione como es debido

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Persona {
 
    //Atributos de la clase Persona
    private String nombre;
    private int edad;
 
    //Constructor de clase Persona
    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }
 
    //Métodos set
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
 
    public void setEdad(int edad) {
        this.edad = edad;
    }
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar