java 对象 setter 和创建者在不同的切换情况下

java object setter and creator in different switch cases

我正在制作一个 "monster creator" 带有菜单(开关)
1 - 创建空怪物
2 - 使用参数创建怪物
3 - change/assign空怪物名
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. 现在,当我尝试对空怪物使用 setter 时,Netbeans 会警告我变量未初始化,而当我 运行 代码时,我得到一个错误。

我该如何解决这个问题?

我将尝试在此处添加代码,使其更加直观。

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;

            }

        }
        //
    }
}

编辑:警告是:

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

when you initialize mVacio only in case 1 of the switch statement, it's only initialized when the input case 1, so if case 3 entered before case 1 ,您尝试在初始化之前访问 mVacio

因此你应该将 mVacio 的声明移到 switch 语句之前并给它一个初始值:

Monstruo mVacio = null;

然后在情况 1 中您更改:

Monstruo mVacio = new Monstruo();

至:

mVacio = new Monstruo();

在案例 3 中:

if (mVacio != null)
    mVacio.setNombre(nombre);