Autor Tema: Exception in thread "main" java.lang.RuntimeException: Uncompilable source code  (Leído 1915 veces)

pperboz

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
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
« Última modificación: 18 de Abril 2022, 21:43 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: NOVATO. Java verificar si existe objeto en un case
« Respuesta #1 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);

NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

pperboz

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re: NOVATO. Java verificar si existe objeto en un case
« Respuesta #2 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);
    }
}
« Última modificación: 12 de Marzo 2022, 11:56 por pperboz »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".