为什么HashMap在退出方法后会重置?

时间:2011-04-15 15:52:31

标签: java hashmap nullpointerexception

我在程序中遇到HashMaps的问题。我有几个在顶级阶层宣布:

  public HashMap<String, Object> hmClass = new HashMap<String ,Object>();
        public HashMap<String, Object> hmIns = new HashMap<String, Object>();
        public HashMap<String, Object> hmCon = new HashMap<String, Object>();
        public HashMap<String, Object> hmParam = new HashMap<String, Object>();
        public HashMap<String, Object> hmResult = new HashMap<String, Object>();

在另一种方法中,我将值放入其中:

public String newInstanceCreate(Class c3, String classInstance)//void ??
    {
        Class c = c3;
        String cI = classInstance;
        Object instance = null;
        Object con = null;
        String instanceName = null;

        try{
         instanceName = JOptionPane.showInputDialog(null, "Under what name would you like to store this Instance?", 
                                                "Create an Instance of a Class", JOptionPane.QUESTION_MESSAGE);
        }catch(NullPointerException e)
        {
            newInstanceCreate(c,cI);
        }

        hmClass.put(instanceName, c);  //add the name of the instance as key and class as value to the hashmap 
        System.out.println(hmClass);    

            con = JOptionPane.showInputDialog(null,"Choose Constructor for " + c, "Create an Instance of a Class", 3, null, getConstructors(c), JOptionPane.QUESTION_MESSAGE);


        System.out.println("worked + " + con);
        hmCon.put(instanceName, con);   //add the name of the instance as key and constructor as value to the hashmap
        System.out.println(hmCon);


        try {
            instance = c3.getDeclaredConstructor().newInstance(); //create the instance --KEY
            hmIns.put(instanceName, instance);
            System.out.println("23" + instance);
            hmParam.put(instanceName, getParams(c3, con));  //ask the user for the parameters (doubles) that they want in the instance constructor
                                                            // add the name of the instance as key and parameters(array) as value           

        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e){
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        System.out.print("hmClass: \n" + hmClass + "hmIns: \n" + hmIns + "hmCon: \n" + hmCon + "hmParam: \n" + hmParam);
        return classInstance;
    }

但是当我尝试从另一种方法访问它们时,似乎它们都被重置了。

public void option4()
    {
        System.out.println("hmIns: " + hmIns);
        String stringInstance = JOptionPane.showInputDialog(null, "Which Instance would you like to stringify? " ,
                                            "Stringify an Instance of a Class", JOptionPane.QUESTION_MESSAGE);


        //get all the required info for making the instance
        /*
         * needed: name of stored instance
         *         name of correct and stored constructor 
         *         name of parameters that were created by user (doubles?)
         */
        System.out.println(stringInstance);
        if(hmIns.isEmpty())
            System.out.println("EMPTY");
        Object ins = hmIns.get(stringInstance);
        System.out.println("ins before: " + ins);
        Object cons = hmCon.get(stringInstance);
        System.out.println("cons before: " + cons);
        Object par = hmParam.get(stringInstance);
        System.out.println("par before: " + par);

        //construct an instance and run toString() here
        try {
            ins = ((Constructor)cons).newInstance(par);
            System.out.println(" ins: " + ins);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //result from toString
        /*
         * stored: name of result
         *         result itself (stored as string for now)
         */

        JOptionPane.showMessageDialog(null, "result here??--how to get result to double??", "Stringified Instance of: ", 0);

        mainWindow();
    }

在列出的最后一个方法中,我测试了HashMap是否具有空值而不是实际为空,但它返回为根本没有值。退出第一个方法后,为什么HashMap会重置?

非常感谢您的任何见解。

弗兰

1 个答案:

答案 0 :(得分:4)

它没有重置。我建议你在调试器中查看你的代码,并检查它们是否在查看相同的对象/映射。我怀疑你有两个包含地图的对象。