找回密码
 FreeOZ用户注册
查看: 2542|回复: 25
打印 上一主题 下一主题

[论坛技术] java static initialization 大家怎么初始化static collections

[复制链接]
跳转到指定楼层
1#
发表于 11-2-2010 16:41:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
  1. public class PayrollFileDao
  2. {
  3. public static HashMap statusDisplaysMap =new HashMap();
  4. static {
  5.     初始化 statusDisplaysMap
  6. }

  7. }
复制代码
我用 PayrollFileDao.statusDisplaysMap.get 总是报错说是初始化错误。
我的代码有什么问题吗?

后来我改了下初始化才不报错了。
  1. public static HashMap statusDisplaysMap =new HashMap() {
  2.     {
  3.     put(Integer.toString(Constants.IMPORT_STATUS_PROCESS_FAILED), "Failed");
  4.     put(Integer.toString(Constants.IMPORT_STATUS_DELETED), "Deleted");
  5.     put(Integer.toString(Constants.IMPORT_STATUS_IMPORTED), "Imported");
  6.     put(Integer.toString(Constants.IMPORT_STATUS_CREATED), "Sucessful");
  7.     }
  8.   };
复制代码
大家一般怎么初始化COLLECTIONS的?
还有什么好的方法可以初始化?

顺便说一下,struts 太糟糕了,我从php转到java,这个struts 简直就是噩梦。搞不懂那么多大企业都喜欢
回复  

使用道具 举报

2#
发表于 11-2-2010 16:55:41 | 只看该作者
代码看不懂的人帮顶
回复  

使用道具 举报

3#
发表于 11-2-2010 17:03:10 | 只看该作者
如果只是为了看起来好看,可以放在另一个静态方法里面。

或者把你的hash map 里面的东西 全放到一个 enum 里面更好。因为全是常量嘛。

评分

参与人数 1威望 +10 收起 理由
lufumin1832 + 10 谢谢分享!

查看全部评分

回复  

使用道具 举报

4#
发表于 11-2-2010 17:08:10 | 只看该作者
public static HashMap statusDisplaysMap;

static {
statusDisplaysMap=new HashMap();
    初始化 statusDisplaysMap
}

评分

参与人数 1威望 +10 收起 理由
lufumin1832 + 10 谢谢分享!

查看全部评分

回复  

使用道具 举报

5#
发表于 11-2-2010 17:22:20 | 只看该作者
楼主的那个应该也行的,能把错误信息贴出来么?
回复  

使用道具 举报

6#
 楼主| 发表于 11-2-2010 19:27:41 | 只看该作者
原帖由 清风不写字 于 11-2-2010 17:03 发表
如果只是为了看起来好看,可以放在另一个静态方法里面。

或者把你的hash map 里面的东西 全放到一个 enum 里面更好。因为全是常量嘛。

假设用我第一种方法,那调用那个map 是不是应该静态调用啊,不需要创建个object吧。

我明天上班看看log再把错误信息帖上来
回复  

使用道具 举报

7#
 楼主| 发表于 11-2-2010 19:28:03 | 只看该作者
原帖由 kawara 于 11-2-2010 17:08 发表
public static HashMap statusDisplaysMap;

static {
statusDisplaysMap=new HashMap();
    初始化 statusDisplaysMap
}

你的这个和我报错的那个没区别啊?
回复  

使用道具 举报

8#
发表于 11-2-2010 21:26:41 | 只看该作者
原帖由 lufumin1832 于 11-2-2010 19:27 发表
假设用我第一种方法,那调用那个map 是不是应该静态调用啊,不需要创建个object吧。


不用创建object,不过创建了也不应该出错
回复  

使用道具 举报

9#
 楼主| 发表于 12-2-2010 08:48:42 | 只看该作者
  1. 2010-02-11 03:56:54 StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
  2. javax.servlet.ServletException: Servlet execution threw an exception
  3.         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:222)
  4.         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:146)
  5.         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:209)
  6.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
  7.         at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
  8.         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
  9.         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:144)
  10.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
  11.         at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
  12.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
  13.         at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
  14.         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
  15.         at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2358)
  16.         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:133)
  17.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
  18.         at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:118)
  19.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
  20.         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:116)
  21.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
  22.         at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
  23.         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
  24.         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:127)
  25.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
  26.         at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
  27.         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
  28.         at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:152)
  29.         at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
  30.         at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
  31.         at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
  32.         at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
  33.         at java.lang.Thread.run(Thread.java:536)
  34. ----- Root Cause -----
  35. java.lang.ExceptionInInitializerError
  36.         at com.rem.ibas.model.action.PayrollBankingConfirmationAction.securePerform(PayrollBankingConfirmationAction.java:103)
  37.         at com.rem.ibas.model.action.SecureAction.perform(SecureAction.java:87)
  38.         at org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.java:1787)
  39.         at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1586)
  40.         at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:492)
  41.         at javax.servlet.http.HttpServlet.service(HttpServlet.java:696)
  42.         at javax.servlet.http.HttpServlet.service(HttpServlet.java:809)
  43.         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:200)
  44.         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:146)
  45.         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:209)
  46.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
  47.         at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
  48.         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
  49.         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:144)
  50.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
  51.         at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
  52.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
  53.         at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
  54.         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
  55.         at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2358)
  56.         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:133)
  57.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
  58.         at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:118)
  59.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
  60.         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:116)
  61.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
  62.         at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
  63.         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
  64.         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:127)
  65.         at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
  66.         at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
  67.         at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
  68.         at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:152)
  69.         at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
  70.         at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
  71.         at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
  72.         at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
  73.         at java.lang.Thread.run(Thread.java:536)
  74. Caused by: java.lang.NullPointerException
  75.         at com.rem.ibas.dao.PayrollFileDao.<clinit>(PayrollFileDao.java:278)
  76.         ... 38 more
复制代码
第一种方法的错误信息
回复  

使用道具 举报

10#
 楼主| 发表于 12-2-2010 08:51:41 | 只看该作者
Caused by: java.lang.NullPointerException
        at com.rem.ibas.dao.PayrollFileDao.<clinit>(PayrollFileDao.java:278

难道静态初始化不能引用其他class的static property?
Constants.IMPORT_STATUS_PROCESS_FAILED  是其他class的static property
回复  

使用道具 举报

11#
发表于 12-2-2010 09:29:56 | 只看该作者
肯定是别的原因,不过既然有了解决办法,就不用深究了
回复  

使用道具 举报

12#
 楼主| 发表于 12-2-2010 09:40:12 | 只看该作者
原帖由 yuba 于 12-2-2010 09:29 发表
肯定是别的原因,不过既然有了解决办法,就不用深究了

不知道原因,我睡不好,老想着
回复  

使用道具 举报

13#
发表于 12-2-2010 09:57:41 | 只看该作者
能把
初始化 statusDisplaysMap
这句写得稍微清楚一些吗?

这个伪代码太伪了
回复  

使用道具 举报

14#
 楼主| 发表于 12-2-2010 10:12:44 | 只看该作者
public class PayrollFileDao
{
public static HashMap statusDisplaysMap =new HashMap();
static {
     statusDisplaysMap.put(Integer.toString(Constants.IMPORT_STATUS_PROCESS_FAILED), "Failed");
     statusDisplaysMap.put(Integer.toString(Constants.IMPORT_STATUS_DELETED), "Deleted");
     statusDisplaysMap.put(Integer.toString(Constants.IMPORT_STATUS_IMPORTED), "Imported");
     statusDisplaysMap.put(Integer.toString(Constants.IMPORT_STATUS_CREATED), "Sucessful");
}

}
回复  

使用道具 举报

15#
发表于 12-2-2010 11:03:57 | 只看该作者
你的程序没有问题,应该也不是Struts或者Tomcat的问题
回复  

使用道具 举报

16#
 楼主| 发表于 12-2-2010 14:19:46 | 只看该作者
回复  

使用道具 举报

17#
发表于 12-2-2010 15:45:35 | 只看该作者
原帖由 lufumin1832 于 12-2-2010 08:51 发表
Caused by: java.lang.NullPointerException
        at com.rem.ibas.dao.PayrollFileDao.(PayrollFileDao.java:278

难道静态初始化不能引用其他class的static property?
Constants.IMPORT_STATUS_PROCESS_FAI ...

不能,静态变量初始化和静态初始化块是在class load时候进行的。并不是在用哪个class之前才load的。class loading 次序不确定。
回复  

使用道具 举报

18#
发表于 12-2-2010 16:04:27 | 只看该作者
原帖由 kawara 于 12-2-2010 15:45 发表
不能,静态变量初始化和静态初始化块是在class load时候进行的。并不是在用哪个class之前才load的。class loading 次序不确定。


现在的问题是次序很确定

一种可以,另一种咋都不行
回复  

使用道具 举报

19#
 楼主| 发表于 12-2-2010 16:24:33 | 只看该作者
原帖由 kawara 于 12-2-2010 15:45 发表

不能,静态变量初始化和静态初始化块是在class load时候进行的。并不是在用哪个class之前才load的。class loading 次序不确定。

你的意思是静态初始化的时候是不能引用别的class的静态常量的,只能用自己class的静态常量,如果是这样就可以理解了
回复  

使用道具 举报

20#
发表于 12-2-2010 16:30:53 | 只看该作者
原帖由 kawara 于 12-2-2010 15:45 发表

不能,静态变量初始化和静态初始化块是在class load时候进行的。并不是在用哪个class之前才load的。class loading 次序不确定。

如果这样,那他的第二种也应该出错啊。
回复  

使用道具 举报

21#
发表于 12-2-2010 16:52:37 | 只看该作者
没用过java,不过据我多年的C++/C#应用经验,思想应该是一样的。原则是静态成员变量一般都由静态成员函数初始化,比如静态构造函数,非静态成员函数可以调用静态成员变量,静态成员初始化应在class被第一次使用的时候(实例化或调用静态成员函数)。
回复  

使用道具 举报

22#
发表于 12-2-2010 16:55:48 | 只看该作者
建议lz定义static的构造函数,在里面初始化静态成员变量吧,代码规约很重要的
回复  

使用道具 举报

23#
 楼主| 发表于 12-2-2010 17:09:28 | 只看该作者
原帖由 清风不写字 于 12-2-2010 16:30 发表

如果这样,那他的第二种也应该出错啊。

是啊,要是这样第二种也应该报错才对啊,晕了
回复  

使用道具 举报

24#
 楼主| 发表于 12-2-2010 17:10:25 | 只看该作者
原帖由 beysup 于 12-2-2010 16:52 发表
没用过java,不过据我多年的C++/C#应用经验,思想应该是一样的。原则是静态成员变量一般都由静态成员函数初始化,比如静态构造函数,非静态成员函数可以调用静态成员变量,静态成员初始化应在class被第一次使用的时候 ...

我不是图方便,而且初始化一次就不变了
回复  

使用道具 举报

25#
 楼主| 发表于 12-2-2010 17:11:46 | 只看该作者
难道是JAVA本身的bug??
回复  

使用道具 举报

26#
发表于 17-2-2010 01:51:29 | 只看该作者
原帖由 kawara 于 12-2-2010 15:45 发表

不能,静态变量初始化和静态初始化块是在class load时候进行的。并不是在用哪个class之前才load的。class loading 次序不确定。


静态变量和静态初始化块都是在class的initialization阶段被执行的,也就是报错信息中的Clinit方法,这个方法是java编译生成的内部方法,外部无法直接调用。至于执行顺序一般是按照在代码中出现的顺序执行。
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 13-12-2024 03:52 , Processed in 0.057952 second(s), 42 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表