FreeOZ论坛

标题: java static initialization 大家怎么初始化static collections [打印本页]

作者: 周星星1832    时间: 11-2-2010 16:41
标题: java static initialization 大家怎么初始化static collections
  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 简直就是噩梦。搞不懂那么多大企业都喜欢
作者: dark008    时间: 11-2-2010 16:55
代码看不懂的人帮顶
作者: 清风不写字    时间: 11-2-2010 17:03
如果只是为了看起来好看,可以放在另一个静态方法里面。

或者把你的hash map 里面的东西 全放到一个 enum 里面更好。因为全是常量嘛。
作者: kawara    时间: 11-2-2010 17:08
public static HashMap statusDisplaysMap;

static {
statusDisplaysMap=new HashMap();
    初始化 statusDisplaysMap
}
作者: 清风不写字    时间: 11-2-2010 17:22
楼主的那个应该也行的,能把错误信息贴出来么?
作者: 周星星1832    时间: 11-2-2010 19:27
原帖由 清风不写字 于 11-2-2010 17:03 发表
如果只是为了看起来好看,可以放在另一个静态方法里面。

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

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

我明天上班看看log再把错误信息帖上来
作者: 周星星1832    时间: 11-2-2010 19:28
原帖由 kawara 于 11-2-2010 17:08 发表
public static HashMap statusDisplaysMap;

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

你的这个和我报错的那个没区别啊?
作者: yuba    时间: 11-2-2010 21:26
原帖由 lufumin1832 于 11-2-2010 19:27 发表
假设用我第一种方法,那调用那个map 是不是应该静态调用啊,不需要创建个object吧。


不用创建object,不过创建了也不应该出错
作者: 周星星1832    时间: 12-2-2010 08:48
  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
复制代码
第一种方法的错误信息
作者: 周星星1832    时间: 12-2-2010 08:51
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
作者: yuba    时间: 12-2-2010 09:29
肯定是别的原因,不过既然有了解决办法,就不用深究了
作者: 周星星1832    时间: 12-2-2010 09:40
原帖由 yuba 于 12-2-2010 09:29 发表
肯定是别的原因,不过既然有了解决办法,就不用深究了

不知道原因,我睡不好,老想着
作者: yuba    时间: 12-2-2010 09:57
能把
初始化 statusDisplaysMap
这句写得稍微清楚一些吗?

这个伪代码太伪了
作者: 周星星1832    时间: 12-2-2010 10:12
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");
}

}
作者: yuba    时间: 12-2-2010 11:03
你的程序没有问题,应该也不是Struts或者Tomcat的问题
作者: 周星星1832    时间: 12-2-2010 14:19

作者: kawara    时间: 12-2-2010 15:45
原帖由 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 次序不确定。
作者: yuba    时间: 12-2-2010 16:04
原帖由 kawara 于 12-2-2010 15:45 发表
不能,静态变量初始化和静态初始化块是在class load时候进行的。并不是在用哪个class之前才load的。class loading 次序不确定。


现在的问题是次序很确定

一种可以,另一种咋都不行
作者: 周星星1832    时间: 12-2-2010 16:24
原帖由 kawara 于 12-2-2010 15:45 发表

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

你的意思是静态初始化的时候是不能引用别的class的静态常量的,只能用自己class的静态常量,如果是这样就可以理解了
作者: 清风不写字    时间: 12-2-2010 16:30
原帖由 kawara 于 12-2-2010 15:45 发表

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

如果这样,那他的第二种也应该出错啊。
作者: beysup    时间: 12-2-2010 16:52
没用过java,不过据我多年的C++/C#应用经验,思想应该是一样的。原则是静态成员变量一般都由静态成员函数初始化,比如静态构造函数,非静态成员函数可以调用静态成员变量,静态成员初始化应在class被第一次使用的时候(实例化或调用静态成员函数)。
作者: beysup    时间: 12-2-2010 16:55
建议lz定义static的构造函数,在里面初始化静态成员变量吧,代码规约很重要的
作者: 周星星1832    时间: 12-2-2010 17:09
原帖由 清风不写字 于 12-2-2010 16:30 发表

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

是啊,要是这样第二种也应该报错才对啊,晕了
作者: 周星星1832    时间: 12-2-2010 17:10
原帖由 beysup 于 12-2-2010 16:52 发表
没用过java,不过据我多年的C++/C#应用经验,思想应该是一样的。原则是静态成员变量一般都由静态成员函数初始化,比如静态构造函数,非静态成员函数可以调用静态成员变量,静态成员初始化应在class被第一次使用的时候 ...

我不是图方便,而且初始化一次就不变了
作者: 周星星1832    时间: 12-2-2010 17:11
难道是JAVA本身的bug??
作者: wykdy    时间: 17-2-2010 01:51
原帖由 kawara 于 12-2-2010 15:45 发表

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


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




欢迎光临 FreeOZ论坛 (https://www.freeoz.org/bbs/) Powered by Discuz! X3.2