日期:2014-05-19  浏览次数:20947 次

求助,给静态变量赋值后不起作用
SOS
我在tomcat启动时自动加载了一个类businessDataInit,目的是为了把一些数据存到内存中,是用一个MAP存放的,但是后面取出来的是空,后来我在这个类里面定义了一个静态变量a,在init()方法里面给这个变量a赋值为333,最后取出来的还是默认值0,谁知道是为什么吗?这段代码在tomcaty启动的时候确实是执行过的,因为我以debug方式启动的时候打断点看了

下面是代码
Java code

private static Map<String,String> paramMap = new HashMap<String, String>();
private static int a = 1;

public void init(){
        try {
            super.init();
            businessDataInit.a = 333;
            businessDataInit.paramMap.put("obj1", "小刚");
            businessDataInit.paramMap.put("obj2", "小明");
        } catch (ServletException e) {
            e.printStackTrace();
        }
    }



------解决方案--------------------
你确定 init() 方法执行过了么?建议增加点日志来跟踪,如果嫌麻烦就直接:

System.out.println(businessDataInit.paramMap.get("obj1"));

另外,要严格检查下是否有别的地方对 paramMap 重新赋了个 new HashMap();
------解决方案--------------------
我觉得你可能是在几个地方取的a不是哦那个一个变量吧
------解决方案--------------------
探讨

我觉得你可能是在几个地方取的a不是哦那个一个变量吧

------解决方案--------------------
不知道这个是什么原因!
不过我们一般不会用servlet去存放初始化数据
一帮都是有一个准们的存放初始化数据的类,然后在一个启动时候加载的servlet中的init方法中初始化类中的变量,你可以这么试试,你现在的这种写法为啥不行,目前也没有头绪
------解决方案--------------------
楼主的测试方式是有问题的,应该写个servlet进行测试。建议你在businessDataInit类中加上一个静态代码块static{System.out.println("loding class……");},你会发现当你启动tomcat的时候这个代码块执行了一次,你用test()方法进行测试的时候肯定依然会执行的,这说明启动tomcat时businessDataInit被加载到了jvm的内存,test的方法没有访问jvm的内存(也是不可能的)。自己的想法,楼主可以试一下,希望对你有所帮助!
------解决方案--------------------
改写这段代码A类
private static Map<String,String> paramMap;
public static Map getCommonMap(){
if(paramMap == null){
paramMap = new HashMap();
paramMap.put("1","1");
paramMap.put("2","2"); 
}
}

servlet里调用A.getCommonMap();