Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: pperboz en 12 de Marzo 2022, 10:49
-
Buenos días a todos.
El problema que me encuentro es el siguiente. Estoy creando un menú con las siguientes opciones
1 crea objeto
2 imprime el objeto
3 ....
4 sale.
Tengo el problema que si meto un if para que verifique la existencia del objeto en el segundo case netbeans me alerta que el objeto podría NO existir y no me deja lanzar el código. ¿Cómo puedo evitar esto??
do {
System.out.println("1. Generar vehículo");
System.out.println("2. Mostrar datos");
System.out.println("3. Calcular beneficio");
System.out.println("4. Salir");
try {
System.out.println("Escoge la opcion:");
opcionMenu = teclado.nextInt();
switch (opcionMenu) {
case 1:
Vehiculo Vehiculo1 = new Vehiculo("1234ABC", "Seat", 1000);
System.out.println(Vehiculo1.toString());
break;
case 2:
if (Vehiculo1 == null) { \\\ AQUÍ TENGO EL PROBLEMA
System.out.println("No has creado el vehiculo");
}
break;
case 3:
break;
case 4:
salir = true;
break;
default:
System.out.println("Tienes que introducir un valor entre 1 y 4");
}
} catch (InputMismatchException e) {
System.out.println("Tienes que introducir un valor entre 1 y 4");
teclado.next(); // volvemos a activar la entrada de teclado aqui. si no entramos en bucle
}
} while (!salir);
Error que me muestra al compilar
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - variable Vehiculo1 might not have been initialized
at menuvehiculo.MenuVehiculo.main(MenuVehiculo.java:43)
C:\Users\Pedro\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
-
Claro, ese objeto vehículo1 lo estás creando en el case 1.
Pero ese case, puede que ocurra o que no ocurra..., por tanto si ocurre un case 2, sin que previamente haya ocurrido un case 1, estarías haciendo referencia a un objeto que no ha sido creado.
Para evitar esto, puedes declarar ese objeto antes de comience el switch, aunque sea con valor null.
Ya luego, si ocurre un case 1, no lo declaras de nuevo. Solamente has de construir un nuevo objeto usando la misma referencia.
Y en el case 2, ya no habrá problemas para comprobar si esa referencia tiene valor null o no, porque la existencia de esa referencia ahora está garantizada. No va a depender de que ocurra un case 1 previamente.
do {
System.out.println("1. Generar vehículo");
System.out.println("2. Mostrar datos");
System.out.println("3. Calcular beneficio");
System.out.println("4. Salir");
try {
System.out.println("Escoge la opcion:");
opcionMenu = teclado.nextInt();
Vehiculo Vehiculo1 = null;
switch (opcionMenu) {
case 1:
Vehiculo1 = new Vehiculo("1234ABC", "Seat", 1000);
System.out.println(Vehiculo1.toString());
break;
case 2:
if (Vehiculo1 == null) { \\\ AQUÍ TENGO EL PROBLEMA
System.out.println("No has creado el vehiculo");
}
break;
case 3:
break;
case 4:
salir = true;
break;
default:
System.out.println("Tienes que introducir un valor entre 1 y 4");
}
} catch (InputMismatchException e) {
System.out.println("Tienes que introducir un valor entre 1 y 4");
teclado.next(); // volvemos a activar la entrada de teclado aqui. si no entramos en bucle
}
} while (!salir);
-
Lo he atacado como me has indicado y me trasladaba el problema al case 1. Lo he solucionado generando el vehiculo con el constructor por defecto y después modificar el objeto con setters en el case 1. He tenido que generar el objeto antes del do para que me mantuviera los datos durante cada iteración del do-while
Muchísimas gracias por tus indicaciones
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
boolean salir = false;
int opcionMenu;
Vehiculo Vehiculo1 = new Vehiculo();
do {
System.out.println("1. Generar vehículo");
System.out.println("2. Mostrar datos");
System.out.println("3. Calcular beneficio");
System.out.println("4. Salir");
try {
System.out.println("Escoge la opcion:");
opcionMenu = teclado.nextInt();
switch (opcionMenu) {
case 1:
Vehiculo1.setMarca("Seat");
Vehiculo1.setMatricula("1234ABC");
Vehiculo1.setPrecioCompra(3000);
System.out.println(Vehiculo1.toString());
break;
case 2:
System.out.println(Vehiculo1.toString());
break;
case 3:
//// pendiente ////
break;
case 4:
salir = true;
break;
default:
System.out.println("Tienes que introducir un valor entre 1 y 4");
}
} catch (InputMismatchException e) {
System.out.println("Tienes que introducir un valor entre 1 y 4");
teclado.next(); // volvemos a activar la entrada de teclado aqui. si no entramos en bucle
}
} while (!salir);
}
}