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

Título: Exception in thread "main" java.lang.RuntimeException: Uncompilable source code
Publicado 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??

Código: [Seleccionar]
        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
Título: Re: NOVATO. Java verificar si existe objeto en un case
Publicado por: Kabuto en 12 de Marzo 2022, 11:17
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.

Citar
        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);

Título: Re: NOVATO. Java verificar si existe objeto en un case
Publicado por: pperboz en 12 de Marzo 2022, 11:48
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



Código: [Seleccionar]
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);
    }
}