Issue
I'm making a "monster creator" with a menu (switch)
1 - create empty monster
2 - create monster with parameters
3 - change/assign empty monster name
4 - ...
N - ...
When option 1 and 2 are already coded and they seem to work, the getters and the setters are tested and working in option 2. Now, when I try to use the setter for the empty monster Netbeans gives me a warning that the variable is not initialized, and when i run the code i get an error.
How can i fix this?
I'll try to add the code here so it's more visual.
package Monstruo;
/**
* @author JuanVictor
*/
public class ConfigMonstruo {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int menu = 0, x, y;
String monstruoVacio = "", monstruoConDatos = "", nombre, color;
int opcion;
int salida = 0;
while (salida == 0) {
ES.msg("Configuración de Monstruos.\n\n================================\n");
ES.msgln("1.- Crear un nuevo monstruo sin datos.");
ES.msgln("2.- Crear una nuevo monstruo con datos conocidos.");
ES.msgln("3.- Asignar nombre a al monstruo sin datos.");
ES.msgln("4.- Asignar posición X al monstruo sin datos.");
ES.msgln("5.- Asignar posición Y al monstruo sin datos.");
ES.msgln("6.- Asignar color al monstruo sin datos.");
ES.msgln("7.- Mostrar por pantalla los datos de un monstruo.\n");
ES.msgln("0.- Salir de la aplicación.\n================================");
opcion = ES.leeEntero("Introduzca la opción elegida: ", 0, 7);
switch (opcion) {
//opcion de salida del programa
case 0:
System.out.println("Aplicacion Finalizada");
salida = 1;
break;
case 1:
System.out.println("Creando un nuevo monstruo sin datos...\n");
//un wait de 1 segundo con fines estéticos .
try {
Thread.sleep(1000); //1 segundo.
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
//instanciación de el monstruo sin características
Monstruo mVacio = new Monstruo();
break;
case 2:
System.out.println("Creando un nuevo monstruo con datos conocidos...");
nombre = ES.leeCadena("Introduzca el nombre del monstruo: ");
x = ES.leeEntero("Introduzca la posicion X del monstruo: ");
y = ES.leeEntero("Introduzca la posicion Y del monstruo: ");
color = ES.leeCadena("Introduzca el color del monstruo: \n" );
Monstruo mDatos = new Monstruo(nombre, x, y, color);
mDatos.setNombre(nombre);
mDatos.setPosicionX(x);
mDatos.setPosicionY(y);
mDatos.setColor(color);
System.out.println("\n" +mDatos.toString()+"\n");
break;
case 3:
System.out.println("Asignar nombre a al monstruo sin datos.");
nombre=ES.leeCadena("Introdce el nombre del monstruo: ");
mVacio.setNombre(nombre); //here is the warning
break;
}
}
//
}
}
EDIT: the warning is:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - variable mVacio might not have been initialized at Monstruo.ConfigMonstruo.main(ConfigMonstruo.java:73) Java Result: 1
Solution
When you initialize mVacio
only in case 1
of the switch statement, it is only initialized when case 1
is entered, so if case 3
is entered before case 1, you try to access mVacio
before it is initialized.
Therefore you should move the declaration of mVacio
to be before the switch statement and give it an initial value :
Monstruo mVacio = null;
Then in case 1 you change :
Monstruo mVacio = new Monstruo();
to:
mVacio = new Monstruo();
And in case 3 :
if (mVacio != null)
mVacio.setNombre(nombre);
Answered By - Eran