Java - ayuda mi valor no se muestra porque es null

 
Vista:

ayuda mi valor no se muestra porque es null

Publicado por Danni (12 intervenciones) el 04/12/2021 19:17:51
tengo un problema a la hora que quiero mostrar un dato con un método que esta en otra clase me sale este error

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "proyecto.Locker.costoLocker()" because the return value of "proyecto.Gimnasio.obtenerLocker(int)" is null
at proyecto.Menu.registrarRentaLocker(Menu.java:126)
at proyecto.Menu.desplegarMenu(Menu.java:41)
at proyecto.Principal.main(Principal.java:10)

me podrían decir porque ocurre eso?
se que hay muchos errores pero me podrían decir porque ocurre eso?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package proyecto;
 
import java.util.Scanner;
 
public class Locker {
    private String nombreCliente;
    private String tamanio;
    private String tipoContratacion;
 
    public Locker(){
 
    }
 
    public Locker(String nombreCliente, String tamanio,String tipoContratacion){
        this.nombreCliente=nombreCliente;
        if(tamanio.equalsIgnoreCase("chico") || tamanio.equalsIgnoreCase("mediano") || tamanio.equalsIgnoreCase("grande"))
        this.tamanio=tamanio;
        if(tipoContratacion.equalsIgnoreCase("Trimestre")|| tipoContratacion.equalsIgnoreCase("Tri")|| tipoContratacion.equalsIgnoreCase("trimestre") || tipoContratacion.equalsIgnoreCase("Mensual") || tipoContratacion.equalsIgnoreCase("Men") || tipoContratacion.equalsIgnoreCase("mensual")){
            this.tipoContratacion=tipoContratacion;
        }
 
    }
 
    public String getNombre(){
        return nombreCliente;
    }
 
    public void setNombre(){
        this.nombreCliente = nombreCliente;
    }
 
    public String getTamanio(){
        return tamanio;
    }
 
    public void setTamanio(String tamanio){
        if(tamanio.equalsIgnoreCase("chico") || tamanio.equalsIgnoreCase("mediano") || tamanio.equalsIgnoreCase("grande"))
        this.tamanio=tamanio;
    }
 
    public void setTipoContratacion(String tipoContratacion){
        if(tipoContratacion.equalsIgnoreCase("Trimestre")|| tipoContratacion.equalsIgnoreCase("Tri") || tipoContratacion.equalsIgnoreCase("Mensual") || tipoContratacion.equalsIgnoreCase("Men") || tipoContratacion.equalsIgnoreCase("mensual"))
            this.tipoContratacion=tipoContratacion;
    }
 
    public String getTipoContratacion(){
        return tipoContratacion;
    }
 
 
 
    public float costoLocker(){
        float costo=0f;
        if (tipoContratacion.equalsIgnoreCase("Trimestre") || tipoContratacion.equalsIgnoreCase("trimestre") || tipoContratacion.equalsIgnoreCase("Tri")) {
            if (tamanio.equalsIgnoreCase("Chico") || tamanio.equalsIgnoreCase("chico")) {
                costo = 120f;
            } else if (tamanio.equalsIgnoreCase("Mediano") || tamanio.equalsIgnoreCase("mediano")) {
                costo = 160f;
            } else if (tamanio.equalsIgnoreCase("Grande") || tamanio.equalsIgnoreCase("grande")) {
                costo = 195f;
            }
        }else if (tipoContratacion.equalsIgnoreCase("Mensual") || tipoContratacion.equalsIgnoreCase("Men") || tipoContratacion.equalsIgnoreCase("mensual") ){
            if (tamanio.equalsIgnoreCase("Chico")|| tamanio.equalsIgnoreCase("chico")) {
                costo = 50f;
            } else if (tamanio.equalsIgnoreCase("Mediano") || tamanio.equalsIgnoreCase("mediano")) {
                costo = 60f;
            } else if (tamanio.equalsIgnoreCase("Grande") || tamanio.equalsIgnoreCase("grande")) {
                costo = 75f;
            }
        }else{
            costo=0f;
        }
 
        return costo;
    }
}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
public class Gimnasio {
    private String nombreGimnasio;
    private Locker lockers[];
    private Locker locker;
 
    public Gimnasio(String nombreGimnasio){
        this.nombreGimnasio=nombreGimnasio;
        lockers = new Locker[30];
 
 
 
    }
 
    public Locker obtenerLocker(int posicion) {
        if (posicion>1 &&posicion<=lockers.length){
            if (lockers[posicion-1]!=null){
                return lockers[posicion-1];
            }else{
                return null;
            }
        }else{
                return null;
        }
    }
 
    public Locker obtenerLocker(String nombre) {
        for (Locker i : lockers) {
            if (i.getNombre().equalsIgnoreCase(nombre)) {
                return i;
            }
        }
        return null;
    }
 
    public int getSiguienteDisponible(){
        for (int i = 0; i < lockers.length; i++) {
               if(i>0 && i<29){
                   return i+1;
               }
            }
        return -1;
    }
 
    public void setLocker(Locker locker){
        for (int i = 0; i < lockers.length; i++) {
 
                this.locker=locker;
              getSiguienteDisponible();
            }
 
    }
 
    public void eliminarLocker(int posicion){
        lockers[posicion-1]=null;
    }
 
 
 
 
    public void mostrarLockersOcupados(){
 
 
        int contador=0;
        for (int i = 0; i < lockers.length; i++) {
            String ocupado;
            if(lockers[i]!=null){
               ocupado="XXX";
            }
           else{
                ocupado="XXX";
            }
            while (i>=0 && i<30){
                System.out.printf("|%10s %10s |", "", i+1+" "+ocupado);
 
                System.out.println("");
                i++;
 
            }
        }
 
        System.out.println("");
    }
 
    public void mostrarOcupacionTipoContrato(){
 
        for (int i = 0; i < lockers.length; i++) {
 
            String contratacionLista;
            while (i>0 && i<10){
                System.out.printf("|%10s |", "", i+1);
                System.out.println("");
                i++;
 
 
            if(lockers[i]==null){
               contratacionLista ="XXX";
            }
            else if(lockers[i].getTipoContratacion().equalsIgnoreCase("Trimestal")){
                contratacionLista="Trimestral";
            }
            else if(lockers[i].getTipoContratacion().equalsIgnoreCase("Mensual")){
                contratacionLista="Mensual";
            }
 
        }
        System.out.println("");
    }
 
    public void mostrarListadoLockers() {
        int lockerVacios = 0, lockerOcupados = 0;
        String claseStr, destinoStr;
        System.out.println("Transportes Intergalácticos de Cajeme, S.A.");
        System.out.println("Listado ocupacion lockers");
        System.out.printf("%20s %20s %20s %20s %20s \n", "Locker", "Nombre del cliente", "Tipo de contratacion", "Tamaño renta", "Costo renta");
 
        for (int i = 0; i < lockers.length; i++) {
 
            System.out.printf("%-20s %-20s $%-20s $%-15.2f\n", lockers[i].getNombre(), lockers[i].getTipoContratacion(), lockers[i].getTamanio(), lockers[i].costoLocker());
 
            if (lockers[i] == null) {
                lockerVacios = lockerVacios + 1;
                System.out.printf("%20s %20s %20s %20s %20s %20s %20s \n", "***Disponible", "", "", "", "", "", "");
            } else {
                lockerOcupados = lockerOcupados + 1;
                System.out.printf("%20s %20s %20s %20s \n", lockers[i].getNombre(), lockers[i].getTipoContratacion(), lockers[i].getTamanio(), lockers[i].costoLocker());
            }
        }
        System.out.println("");
        System.out.println("Asientos vacios: " + lockerVacios);
        System.out.println("Asientos ocupados " + lockerOcupados);
        System.out.println("Total de asientos: " + (lockerVacios + lockerOcupados));
    }
 
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
package proyecto;
 
import java.util.Scanner;
 
 
public class Menu {
    private Gimnasio gimnasio;
    private Locker lokers;
 
    public Menu(){
        Gimnasio gimnasio = new Gimnasio("Potros ITSON");
        this.gimnasio=gimnasio;
    }
 
    public void desplegarMenu(){
        Scanner tec = new Scanner (System.in);
        char opcion;
        do{
            System.out.println("-------------------------------------------");
            System.out.println(gimnasio);
            System.out.println("-------------------------------------------");
            System.out.println("               Menu Principal");
            System.out.println("-------------------------------------------");
 
            System.out.println("1._ Reistrar renta de locker");
            System.out.println("2._ Eliminar renta de locker");
            System.out.println("3._ Mostrar informacion del locker por cliente");
            System.out.println("4._ Editar cliente registrado");
            System.out.println("5._ Mostrar mapa de ocupacion por tipo de contratacion");
            System.out.println("6._ Mostrar listado de lockers");
            System.out.println("7._ Terminar operacion");
            System.out.println("-------------------------------------------");
            System.out.println("Teclee su opcion: ");
            opcion=tec.nextLine().charAt(0);
            System.out.println("");
 
            switch(opcion){
 
                case'1':
                    registrarRentaLocker( );
                    break;
 
                case'2':
                    eliminarRentaLocker();
                    break;
 
                case'3':
                    mostrarLockerCliente();
                    break;
 
                case'4':
                    editarClienteRegistrado();
                    break;
                case'5':
                    mostrarMapaOcupacion();
                    break;
                case'6':
                    listadoLockers();
                    break;
                case'7':
                    break;
                default:
                        System.out.println("*** opcion no valida, ingrese una del 1 al 7 ");
                        System.out.println("Presione Enter Para Continuar ");
                        tec.nextLine();
                        System.out.println("INGRESE LA OPCION DESEADA: ");
                        opcion=tec.nextLine().charAt(0);
                        break;
            }
        }while(opcion>='1' && opcion<= '7');
    }
 
    public void registrarRentaLocker() {
        Scanner tec = new Scanner(System.in);
        System.out.println(" ***Registro de renta ");
        char opcion = 'S';
 
        while (opcion == 'S' || opcion == 's') {
        int posicion = 0;
            //REGRESA AL MENU PRINCIPAL
            if (posicion == -1) {
                break;
            }
            //OBTIENE EL ESTADO DE LOS ASIENTOS EJECUTIVOS
            if (posicion >= 0 && posicion < 30) {
 
                if (gimnasio.obtenerLocker(posicion) != null) {
                    System.out.println("*** *** Número Del locker Disponible");
                    System.out.println("Presione Enter Para Continuar");
                    tec.nextLine();
                    tec.nextLine();
                    System.out.println("Desea Continuar Con El Registro De Renta? (S/N)");
                    opcion = tec.next().charAt(0);
                    while (opcion != 'S' && opcion != 'N' && opcion != 's' && opcion != 'n') {
                        System.out.println("*** Error: Respuesta Inválida.");
                        System.out.println("Presione Enter Para Continuar");
                        tec.nextLine();
                        tec.nextLine();
                        System.out.println("Desea Continuar Con El Registro DE Reservaciones? (S/N)");
                        opcion = tec.next().charAt(0);
                    }
                    if (opcion == 'S' || opcion == 's') {
                    } else if (opcion == 'N' || opcion == 'n') {
                        break;
                    }
                }
                // SE SOLICITAN LOS DATOS DEL cliente
                if (opcion == 'S' || opcion == 's') {
                    System.out.println("Ingrese El Nombre Del cliente: ");
                    String nombreCliente = tec.next();
 
                    System.out.println("Ingrese El tamaño del locker: ");
                    String tamanio = tec.next();
 
                    System.out.println("periodo de renta: ");
                    String tipoContratacion = tec.next();
 
                    float costo=0f;
                    //SE MUESTRAN LOS DATOS DEL CLIENTE
 
                    gimnasio.getSiguienteDisponible();
                    System.out.println(" **********Confirmacion ");
                    System.out.println("Cliente: " + nombreCliente);
                    System.out.println("Tamaño: " + tamanio);
                    System.out.println("Contratacion: " + tipoContratacion);
                    System.out.println("Costo: " + gimnasio.obtenerLocker(posicion).costoLocker());
                    System.out.println("Locker asignado: " + gimnasio.getSiguienteDisponible());
                    System.out.println("");
 
                    // SE CONFIRMA LA RENTA
                    System.out.println("confirmar el registro? (S/N): ");
                    char confirmar = tec.next().charAt(0);
                    while (confirmar != 'S' && confirmar != 'N' && confirmar != 's' && confirmar != 'n') {
                        System.out.println("*** Error: Respuesta inválida.");
                        System.out.println("Presione Enter Para Continuar");
                        tec.nextLine();
                        tec.nextLine();
                        System.out.println("Desea Confirmar El Registro De Reservaciones (S/N).");
                        confirmar = tec.next().charAt(0);
                    }
 
                    //SE REALIZA LA RRENTA
                    if (confirmar == 'S' || confirmar == 's') {
                        // SE CREA AL CLIENTE
                        Locker locker = new Locker(nombreCliente, tamanio, tipoContratacion);
                        gimnasio.setLocker(locker);
                        System.out.println("Reservacion Realizada.");
 
                        // SE PREGUNTA PARA CONTINUAR EN EL METODO RENTA O REGRESAR A EL MENU PRINCIPAL
                        System.out.println("Desea Continuar Con El Registro De Reservaciones, (S/N).");
                        opcion = tec.next().charAt(0);
                        while (opcion != 'S' && opcion != 'N' && opcion != 's' && opcion != 'n') {
                            System.out.println("*** Error: Respuesta Inválida.");
                            System.out.println("Presione Enter Para Continuar");
                            tec.nextLine();
                            tec.nextLine();
                            System.out.println("Desea Continuar Con El Registro De Reservaciones, (S/N).");
                            opcion = tec.next().charAt(0);
                        }
                        if (opcion == 'S' || opcion == 's') {
                        } else if (opcion == 'N' || opcion == 'n') {
                            break;
                        }
                    } else if (confirmar == 'N' || confirmar == 'n') {
                        System.out.println("Reservacion No Realizada.");
                     // SE PREGUNTA PARA CONTINUAR EN EL METODO RENTA O REGRESAR A EL MENU PRINCIPAL
                        System.out.println("Desea Continuar Con El Registro De Reservaciones, (S/N).");
                        opcion = tec.next().charAt(0);
                        while (opcion != 'S' && opcion != 'N' && opcion != 's' && opcion != 'n') {
                            System.out.println("*** Error: Respuesta Inválida.");
                            System.out.println("Presione Enter Para Continuar");
                            tec.nextLine();
                            tec.nextLine();
                            System.out.println("Desea Continuar Con El Registro De Reservaciones, (S/N).");
                            opcion = tec.next().charAt(0);
                        }
                        if (opcion == 'S' || opcion == 's') {
                        } else if (opcion == 'N' || opcion == 'n') {
                            break;
                        }
                    }
                }
            }
 
        }
 
    }
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

ayuda mi valor no se muestra porque es null

Publicado por Danni (12 intervenciones) el 04/12/2021 23:32:50
aclaración lo que debe hacer el método obtenerLocker es: Permite obtener el locker asignado a una posición determinada, deberá validar que el número sea una posición válida. Regresa null si el locker no está ocupado.

también intenté usar este método para hacer el código mas corto pero tengo el mismo error
1
2
3
4
5
6
7
8
9
10
11
12
13
public void imprimirDatos(int posicion) {
        String nombreCliente = lockers[posicion].getNombre();
        String tamanio = lockers[posicion].getTamanio();
        String tipoContratacion = lockers[posicion].getTipoContratacion();
        Locker locker = new Locker(nombreCliente, tamanio, tipoContratacion);
        System.out.println(" **********Confirmacion ");
        System.out.println("Cliente: " + nombreCliente);
        System.out.println("Tamaño: " + tamanio);
        System.out.println("Contratacion: " + tipoContratacion);
        System.out.println("Costo: " + locker.costoLocker());
        System.out.println("Locker asignado: " + (posicion + 1));
        System.out.println("");
    }
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

ayuda mi valor no se muestra porque es null

Publicado por Kabuto (1381 intervenciones) el 05/12/2021 00:39:55
En el constructor de Gimnasio....
1
2
3
4
public Gimnasio(String nombreGimnasio) {
		this.nombreGimnasio=nombreGimnasio;
		lockers = new Locker[30];
	}

En la línea que marco en negrita, se inicializa un array de 30 Lockers.
Ok, bien..

Pero esos 30 Lockers, no están inicializados, es decir, son 30 objetos con valor null.

Así que el programa comienza con 30 valores null. Y al querer registrar un locker, no se inicializa en ningún momento.
Se piden datos al usuario y luego se llama al método costoLocker() sobre el Locker obtenido...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
				// SE SOLICITAN LOS DATOS DEL cliente
				if (opcion == 'S' || opcion == 's') {
					System.out.println("Ingrese El Nombre Del cliente: ");
					String nombreCliente = tec.next();
 
					System.out.println("Ingrese El tamaño del locker: ");
					String tamanio = tec.next();
 
					System.out.println("periodo de renta: ");
					String tipoContratacion = tec.next();
 
					float costo=0f;
					//SE MUESTRAN LOS DATOS DEL CLIENTE
 
					gimnasio.getSiguienteDisponible();
					System.out.println(" **********Confirmacion ");
					System.out.println("Cliente: " + nombreCliente);
					System.out.println("Tamaño: " + tamanio);
					System.out.println("Contratacion: " + tipoContratacion);
					System.out.println("Costo: " + gimnasio.obtenerLocker(posicion).costoLocker());
					System.out.println("Locker asignado: " + gimnasio.getSiguienteDisponible());
					System.out.println("");

Pero como lo que se obtiene es un valor null, pues es imposible pretender ejecutar el método costoLocker().

Tienes que inicializar el nuevo Locker que se está registrando, antes de intentar preguntarle cual es su costo.

También te he marcado en negrita la linea
gimnasio.getSiguienteDisponible();
porque ese método te devuelve un int, y no lo estás recogiendo. Supongo que la idea era recogerlo en la variable "posicion", la cuál ahora mismo siempre conserva el valor 0 inicial.

Así que deberías recoger el valor que te da siguienteDisponible, inicializar el Locker con los datos que te ha dado el usuario, y ya luego sí podrás consultar su costo.


Por otra parte, puede que en este caso trabajar con valores null para diferenciar entre Lockers disponibles y Lockers ocupados, te de dolores de cabeza como este.

Quizás podrías estudiar la posibilidad de usar un boolean para decidir si un Locker está disponible o no.
1
2
3
4
5
public class Locker {
    private String nombreCliente;
    private String tamanio;
    private String tipoContratacion;
    private boolean estaDisponible = true;

Así luego en la clase Gimnasio, se puede inicializar todos los Lockers del array para no tener valores null
1
2
3
4
5
6
7
8
9
public Gimnasio(String nombreGimnasio) {
		this.nombreGimnasio=nombreGimnasio;
		lockers = new Locker[30];
 
		//Inicializacion de Lockers, por defecto, todos comienzan como DISPONIBLES
		for (int i = 0; i < lockers.length; i++) {
			lockers[i] = new Locker();
		}
	}

Cuando un Locker vaya a ser adjudicado a un nuevo usuario, pues solo habría que usar los setters adecuados para marcar estaDisponible como FALSE, así como el nombre, el tipo de contratación y el tamaño.

De esta manera, no se trabaja con valores null y no hay riesgo de que el programa falle por intentar llamar un método sobre un objeto con valor null.


Pero vamos, puede hacerse con la forma que has planteado de usar valores null. Pero entonces hay que poner atención extra al flujo del programa y preveer la posibilidad de encontrarte con valores null inesperados.
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

ayuda mi valor no se muestra porque es null

Publicado por Danni (12 intervenciones) el 05/12/2021 01:38:24
como se inicializa un arreglo? soy nueva y no se mucho de arreglos
y sobre lo de utilizar el boolean no puedo agregar mas atributos a ninguna clase, también si me podrías explicar mejor sobre lo de recoger el int de getSiguienteDisponible() lo agradecería
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

ayuda mi valor no se muestra porque es null

Publicado por Kabuto (1381 intervenciones) el 05/12/2021 17:29:42
El arreglo está inicializado.
Lo que no está inicializado son los objetos Lockers que contiene. El programa está diseñado así, solo se inicializa un Locker cuando se adjudica a un usuario.
Y esa es la parte que faltaría, inicializar el Locker adjudicado.

¿Y cómo sabemos cuál de los 30 Lockers que contiene el array es el adjudicado en cada caso?
Eso nos lo dice el método gimnasio.getSiguienteDisponible();, que nos devuelve un int con el número de Locker (entre 0 y 29) que vamos a adjudicar.

Lo ideal es, que cuando el usuarios nos haya dado los datos para registrar Locker, con esos datos construyamos un nuevo Locker que, de momento, será ajeno al array.
Solo después de que el usuario haya confirmado el registro, transferiremos ese nuevo Locker al array de los 30 Lockers.


Pero antes de eso, vamos a hacer unas correcciones en la clase Gimnasio

El método getSiguienteDiponible() no es correcto.
Ha de buscar una posición que contenga un valor null y retornarla, para indicar que es ahí donde se puede crear un nuevo Locker.
Si no encuentra ningún null, es que no hay espacio para crear un nuevo Locker, y es entonces cuando se retorna el valor -1

1
2
3
4
5
6
7
8
public int getSiguienteDisponible(){
		for (int i = 0; i < lockers.length; i++) {
			if (lockers[i] == null)
				return i;
		}
		//Si el for termina sin retorna nada, es que no hay disponibles
		return -1;
	}

El método setLocker(), su código tampoco parece correcto y además debería ser mucho más sencillo.
Su función debería ser la de recibir un nuevo Locker y posicionarlo en la posición del array que hemos detectado como disponible. Así que es tan sencillo como esto:
1
2
3
public void setLocker(Locker locker, int posicion){
		lockers[posicion] = locker;
	}

Bien, ahora vamos a la clase Menu.
Iba a proponer algunas correcciones para el método registrarRentaLocker(), pero su código se te ha complicado tanto (quizás por copiar trozos de otros programas), que creo que se entenderá todo mejor si lo reescribimos por completo.

De hecho, vamos a cambiar cosas en toda la clase.

No se necesita un atributo lockers..

1
2
3
public class Menu {
	private Gimnasio gimnasio;
	private Locker lokers;

En cambio, si podemos colocar ahí un atributo Scanner, para no tener que declarar uno nuevo en cada método donde el usuario tenga que teclear cosas. Poniendo un Scanner como atributo de clase, estará disponible para ser usado donde sea necesario.

En el constructor, se hace un paso innecesario. Se declara un objeto Gimnasio y luego este se asigna al atributo de la clase
1
2
3
4
public Menu(){
		Gimnasio gimnasio = new Gimnasio("Potros ITSON");
		this.gimnasio=gimnasio;
	}
No es necesario, podemos construir el Gimnasio directamente sobre el atributo de la clase. Si tendremos que inicalizar el objeto Scanner que acabamos de añadir como nuevo atributo.
1
2
3
4
5
6
7
8
public class Menu {
	private Gimnasio gimnasio;
	private Scanner tec;
 
	public Menu(){
		gimnasio = new Gimnasio("Potros ITSON");
		tec = new Scanner(System.in);
	}


En el método desplegarMenu(), recomiendo marcar como líneas de comentarios las llamadas a los métodos que aún no están escritos.
Conforme se vayan escribiendo posteriormente, los desmarcas como comentarios

Y la condición del bucle do while ha de cambiarse, para asegurarnos de que el programa termine cuando se elija la opción 7. De lo contrario, el programa se repite hasta el infinito.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public void desplegarMenu(){
		char opcion;
		do{
			System.out.println("-------------------------------------------");
			System.out.println(gimnasio);
			System.out.println("-------------------------------------------");
			System.out.println("               Menu Principal");
			System.out.println("-------------------------------------------");
 
			System.out.println("1._ Registrar renta de locker");
			System.out.println("2._ Eliminar renta de locker");
			System.out.println("3._ Mostrar informacion del locker por cliente");
			System.out.println("4._ Editar cliente registrado");
			System.out.println("5._ Mostrar mapa de ocupacion por tipo de contratacion");
			System.out.println("6._ Mostrar listado de lockers");
			System.out.println("7._ Terminar operacion");
			System.out.println("-------------------------------------------");
			System.out.println("Teclee su opcion: ");
			opcion=tec.nextLine().charAt(0);
			System.out.println("");
 
			switch(opcion){
 
			case'1':
				registrarRentaLocker();
				break;
 
			case'2':
				//eliminarRentaLocker();
				break;
 
			case'3':
				//mostrarLockerCliente();
				break;
 
			case'4':
				//editarClienteRegistrado();
				break;
			case'5':
				//mostrarMapaOcupacion();
				break;
			case'6':
				//listadoLockers();
				break;
			case'7':
				break;
			default:
				System.out.println("*** opcion no valida, ingrese una del 1 al 7 ");
				System.out.println("Presione Enter Para Continuar ");
				tec.nextLine();
				System.out.println("INGRESE LA OPCION DESEADA: ");
				opcion=tec.nextLine().charAt(0);
				break;
			}
		}while(opcion != '7');
	}


Y ahora vendría el método registrarRentaLocker(), el cuál si considero que es mejor reescribirlo entero:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public void registrarRentaLocker() {
		//Comenzamos averiguando si hay disponibilidad para un nuevo Locker
		int disponible = gimnasio.getSiguienteDisponible();
		if (disponible == -1) { //No la hay, se regresará al menú principal
			System.out.println("En este momento no hay lockers disponibles");
			System.out.println("\tPresione ENTER para continuar...");
			tec.nextLine();
		}
		else { //Sí la hay, pedimos datos al cliente
			System.out.println("Ingrese El Nombre Del cliente: ");
			String nombreCliente = tec.nextLine();
 
			System.out.println("Ingrese El tamaño del locker: ");
			String tamanio = tec.nextLine();
 
			System.out.println("periodo de renta: ");
			String tipoContratacion = tec.nextLine();
 
			//Construimos nuevo Locker, pero aún no quedará registrado
			Locker nuevoLocker = new Locker(nombreCliente, tamanio, tipoContratacion);
 
			//SE MUESTRAN LOS DATOS DEL CLIENTE
			System.out.println(" **********Confirmacion ");
			System.out.println("Cliente: " + nombreCliente);
			System.out.println("Tamaño: " + tamanio);
			System.out.println("Contratacion: " + tipoContratacion);
			System.out.println("Costo: " + nuevoLocker.costoLocker());
			System.out.println("Locker asignado: " + (disponible + 1));
			System.out.println("");
 
			//Confirmacion
			char confirmacion = ' ';
			while (confirmacion != 's' && confirmacion != 'n') {
				System.out.println("confirmar el registro? (S/N): ");
				confirmacion = tec.nextLine().toLowerCase().charAt(0);
				if (confirmacion == 's') {
					//Registramos nuevo locker en el gimnasio
					gimnasio.setLocker(nuevoLocker, disponible);
					System.out.println("Registro completado");
				}
				else if (confirmacion == 'n')
					System.out.println("Registro cancelado");
				else
					System.out.println("Error. Responda con (S/N)");
 
				System.out.println("Presione ENTER para continuar");
				tec.nextLine();
			}
		}
	}


Y con estos cambios, ahora ya podemos registrar Lockers.
Al consultar el costo ya no da error, porque ahora lo consultamos sobre un Locker correctamente inicializado y no sobre un objeto null como pasaba antes.
Cuando el usuario confirma el registro, este Locker pasará a sustituir el objeto null en la posición indicada como disponible.

En pantalla vemos, que todo parece funcionar bien

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
-------------------------------------------
lockersGim.Gimnasio@16b98e56
-------------------------------------------
               Menu Principal
-------------------------------------------
1._ Registrar renta de locker
2._ Eliminar renta de locker
3._ Mostrar informacion del locker por cliente
4._ Editar cliente registrado
5._ Mostrar mapa de ocupacion por tipo de contratacion
6._ Mostrar listado de lockers
7._ Terminar operacion
-------------------------------------------
Teclee su opcion:
1
 
Ingrese El Nombre Del cliente:
Serafin
Ingrese El tamaño del locker:
mediano
periodo de renta:
mensual
 **********Confirmacion
Cliente: Serafin
Tamaño: mediano
Contratacion: mensual
Costo: 60.0
Locker asignado: 1
 
confirmar el registro? (S/N):
s
Registro completado
Presione ENTER para continuar
 
-------------------------------------------
lockersGim.Gimnasio@16b98e56
-------------------------------------------
               Menu Principal
-------------------------------------------
1._ Registrar renta de locker
2._ Eliminar renta de locker
3._ Mostrar informacion del locker por cliente
4._ Editar cliente registrado
5._ Mostrar mapa de ocupacion por tipo de contratacion
6._ Mostrar listado de lockers
7._ Terminar operacion
-------------------------------------------
Teclee su opcion:
1
 
Ingrese El Nombre Del cliente:
Laura
Ingrese El tamaño del locker:
grande
periodo de renta:
trimestre
 **********Confirmacion
Cliente: Laura
Tamaño: grande
Contratacion: trimestre
Costo: 195.0
Locker asignado: 2
 
confirmar el registro? (S/N):
s
Registro completado
Presione ENTER para continuar
 
-------------------------------------------
lockersGim.Gimnasio@16b98e56
-------------------------------------------
               Menu Principal
-------------------------------------------
1._ Registrar renta de locker
2._ Eliminar renta de locker
3._ Mostrar informacion del locker por cliente
4._ Editar cliente registrado
5._ Mostrar mapa de ocupacion por tipo de contratacion
6._ Mostrar listado de lockers
7._ Terminar operacion
-------------------------------------------
Teclee su opcion:
7
 
 
	FIN DE PROGRAMA



Sigue intentando tú el resto de métodos que faltan para completar el menú.
No importa si vuelves a atascarte, al contrario, es la mejor forma de aprender. Comparte aquí lo que consigas hacer y te ayudamos a completar.


Si algo de lo dicho no ha quedado claro, pregunta y lo explico de nuevo.

Un saludo.
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

ayuda mi valor no se muestra porque es null

Publicado por Danni (12 intervenciones) el 06/12/2021 01:17:43
muchas gracias de verdad me sirvió, ya estoy haciendo los otros métodos, aun debo hacer ajustes en algunos
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

ayuda mi valor no se muestra porque es null

Publicado por Danni (12 intervenciones) el 07/12/2021 23:51:11
me podrían decir una forma para que en System.out.println("Locker asignado:"); se imprima el número de locker que tiene

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void mostrarLockerCliente() {
        Scanner tec = new Scanner(System.in);
        char opcion = 's';
        while (opcion == 's' || opcion == 'S') {
            System.out.println("Ingrese el nombre del cliente: ");
            String nombre = tec.next();
            if (gimnasio.obtenerLocker(nombre) == null) {
                System.out.println(" el cliente proporcionado no está registrado ");
            } else if (gimnasio.obtenerLocker(nombre).getNombre().equalsIgnoreCase(nombre)) {
                System.out.println(" **** Confirmacion ****");
                System.out.println("Nombre del cliente: " + gimnasio.obtenerLocker(nombre).getNombre());
                System.out.println("Tamaño " + gimnasio.obtenerLocker(nombre).getTamanio());
                System.out.println("Contratacion: " + gimnasio.obtenerLocker(nombre).getTipoContratacion());
                System.out.println("Costo " + gimnasio.obtenerLocker(nombre).costoLocker());
                System.out.println("Locker asignado:");
 
                System.out.println("");
                System.out.println("¿Se desea consultar la informacion de otro cliente, (S/N)?.");
                opcion = tec.next().charAt(0);
                gimnasio.respuestInvalida(opcion);
            }
        }
    }

este es el metodo de obtenerLocker(nombre)
1
2
3
4
5
6
7
8
9
10
public Locker obtenerLocker(String nombre) {
        for (Locker i : lockers) {
            if (i.getNombre().equalsIgnoreCase(nombre)) {
                return i;
            }else{
                return null;
            }
        }
        return null;
    }

si conocen una mejor forma de hacerlo díganmelo porfa
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

ayuda mi valor no se muestra porque es null

Publicado por Kabuto (1381 intervenciones) el 09/12/2021 20:52:27
Necesitas un método que te retorne la posición que ocupa el Locker en el array, y actualmente no tienes ninguno que haga esto.

Entonces, si no quieres cambiar los métodos que ya tienes escritos, pues tendrás que añadir uno nuevo a la clase Gimnasio

Sería parecido al método obtenerLocker(nombre), solo que en lugar de retornarte el Locker, te retornaría su posición en el array.

1
2
3
4
5
6
7
8
public Integer obtenerNumeroLocker(String nombre) {
		for (int i = 0; i < lockers.length; i++)
			if (lockers[i].getNombre().equalsIgnoreCase(nombre))
				return i + 1; //Número de locker es la posicion en el array, incrementado en 1
 
		//Bucle for no ha encontrado locker asignado, porque ninguno coincide con este nombre
		return null;
	}

Ya luego, lo llamas en el menu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void mostrarLockerCliente() {
        Scanner tec = new Scanner(System.in);
        char opcion = 's';
        while (opcion == 's' || opcion == 'S') {
            System.out.println("Ingrese el nombre del cliente: ");
            String nombre = tec.next();
            if (gimnasio.obtenerLocker(nombre) == null) {
                System.out.println(" el cliente proporcionado no está registrado ");
            } else if (gimnasio.obtenerLocker(nombre).getNombre().equalsIgnoreCase(nombre)) {
                System.out.println(" **** Confirmacion ****");
                System.out.println("Nombre del cliente: " + gimnasio.obtenerLocker(nombre).getNombre());
                System.out.println("Tamaño " + gimnasio.obtenerLocker(nombre).getTamanio());
                System.out.println("Contratacion: " + gimnasio.obtenerLocker(nombre).getTipoContratacion());
                System.out.println("Costo " + gimnasio.obtenerLocker(nombre).costoLocker());
                System.out.println("Locker asignado: " + obtenerNumeroLocker(nombre));
 
                System.out.println("");
                System.out.println("¿Se desea consultar la informacion de otro cliente, (S/N)?.");
                opcion = tec.next().charAt(0);
                gimnasio.respuestInvalida(opcion);
            }
        }
    }
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

ayuda mi valor no se muestra porque es null

Publicado por Kabuto (1381 intervenciones) el 11/12/2021 21:09:11
Sí, pero en mensajes anteriores ya dijo que no podía alterar los atributos de las clases.
1
no puedo agregar mas atributos a ninguna clase,
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