周星星1832 发表于 11-2-2010 15:41:26

java static initialization 大家怎么初始化static collections

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

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

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

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

dark008 发表于 11-2-2010 15:55:41

代码看不懂的人帮顶:lol

清风不写字 发表于 11-2-2010 16:03:10

如果只是为了看起来好看,可以放在另一个静态方法里面。

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

kawara 发表于 11-2-2010 16:08:10

public static HashMap statusDisplaysMap;

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

清风不写字 发表于 11-2-2010 16:22:20

楼主的那个应该也行的,能把错误信息贴出来么?

周星星1832 发表于 11-2-2010 18:27:41

原帖由 清风不写字 于 11-2-2010 17:03 发表 http://www.freeoz.org/bbs/images/common/back.gif
如果只是为了看起来好看,可以放在另一个静态方法里面。

或者把你的hash map 里面的东西 全放到一个 enum 里面更好。因为全是常量嘛。
假设用我第一种方法,那调用那个map 是不是应该静态调用啊,不需要创建个object吧。

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

周星星1832 发表于 11-2-2010 18:28:03

原帖由 kawara 于 11-2-2010 17:08 发表 http://www.freeoz.org/bbs/images/common/back.gif
public static HashMap statusDisplaysMap;

static {
statusDisplaysMap=new HashMap();
    初始化 statusDisplaysMap
}
你的这个和我报错的那个没区别啊?

yuba 发表于 11-2-2010 20:26:41

原帖由 lufumin1832 于 11-2-2010 19:27 发表 http://www.freeoz.org/bbs/images/common/back.gif
假设用我第一种方法,那调用那个map 是不是应该静态调用啊,不需要创建个object吧。

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

周星星1832 发表于 12-2-2010 07:48:42

2010-02-11 03:56:54 StandardWrapperValve: Servlet.service() for servlet action threw exception
javax.servlet.ServletException: Servlet execution threw an exception
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:222)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:146)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:209)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:144)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
        at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2358)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:133)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
        at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:118)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:116)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:127)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
        at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:152)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
        at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
        at java.lang.Thread.run(Thread.java:536)
----- Root Cause -----
java.lang.ExceptionInInitializerError
        at com.rem.ibas.model.action.PayrollBankingConfirmationAction.securePerform(PayrollBankingConfirmationAction.java:103)
        at com.rem.ibas.model.action.SecureAction.perform(SecureAction.java:87)
        at org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.java:1787)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1586)
        at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:492)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:696)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:809)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:200)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:146)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:209)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:144)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
        at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2358)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:133)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
        at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:118)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:116)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:127)
        at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:948)
        at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:152)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
        at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
        at java.lang.Thread.run(Thread.java:536)
Caused by: java.lang.NullPointerException
        at com.rem.ibas.dao.PayrollFileDao.<clinit>(PayrollFileDao.java:278)
        ... 38 more第一种方法的错误信息

周星星1832 发表于 12-2-2010 07: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

yuba 发表于 12-2-2010 08:29:56

肯定是别的原因,不过既然有了解决办法,就不用深究了

周星星1832 发表于 12-2-2010 08:40:12

原帖由 yuba 于 12-2-2010 09:29 发表 http://www.freeoz.org/bbs/images/common/back.gif
肯定是别的原因,不过既然有了解决办法,就不用深究了
不知道原因,我睡不好,老想着:'(

yuba 发表于 12-2-2010 08:57:41

能把
初始化 statusDisplaysMap
这句写得稍微清楚一些吗?

这个伪代码太伪了

周星星1832 发表于 12-2-2010 09: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");
}

}

yuba 发表于 12-2-2010 10:03:57

你的程序没有问题,应该也不是Struts或者Tomcat的问题

周星星1832 发表于 12-2-2010 13:19:46

:'( :'( :'( :'( :'(

kawara 发表于 12-2-2010 14:45:35

原帖由 lufumin1832 于 12-2-2010 08:51 发表 http://www.freeoz.org/bbs/images/common/back.gif
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 15:04:27

原帖由 kawara 于 12-2-2010 15:45 发表 http://www.freeoz.org/bbs/images/common/back.gif
不能,静态变量初始化和静态初始化块是在class load时候进行的。并不是在用哪个class之前才load的。class loading 次序不确定。

现在的问题是次序很确定

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

周星星1832 发表于 12-2-2010 15:24:33

原帖由 kawara 于 12-2-2010 15:45 发表 http://www.freeoz.org/bbs/images/common/back.gif

不能,静态变量初始化和静态初始化块是在class load时候进行的。并不是在用哪个class之前才load的。class loading 次序不确定。
你的意思是静态初始化的时候是不能引用别的class的静态常量的,只能用自己class的静态常量,如果是这样就可以理解了

清风不写字 发表于 12-2-2010 15:30:53

原帖由 kawara 于 12-2-2010 15:45 发表 http://www.freeoz.org/bbs/images/common/back.gif

不能,静态变量初始化和静态初始化块是在class load时候进行的。并不是在用哪个class之前才load的。class loading 次序不确定。
如果这样,那他的第二种也应该出错啊。

beysup 发表于 12-2-2010 15:52:37

没用过java,不过据我多年的C++/C#应用经验,思想应该是一样的。原则是静态成员变量一般都由静态成员函数初始化,比如静态构造函数,非静态成员函数可以调用静态成员变量,静态成员初始化应在class被第一次使用的时候(实例化或调用静态成员函数)。

beysup 发表于 12-2-2010 15:55:48

建议lz定义static的构造函数,在里面初始化静态成员变量吧,代码规约很重要的:lol

周星星1832 发表于 12-2-2010 16:09:28

原帖由 清风不写字 于 12-2-2010 16:30 发表 http://www.freeoz.org/bbs/images/common/back.gif

如果这样,那他的第二种也应该出错啊。
是啊,要是这样第二种也应该报错才对啊,晕了

周星星1832 发表于 12-2-2010 16:10:25

原帖由 beysup 于 12-2-2010 16:52 发表 http://www.freeoz.org/bbs/images/common/back.gif
没用过java,不过据我多年的C++/C#应用经验,思想应该是一样的。原则是静态成员变量一般都由静态成员函数初始化,比如静态构造函数,非静态成员函数可以调用静态成员变量,静态成员初始化应在class被第一次使用的时候 ...
我不是图方便,而且初始化一次就不变了

周星星1832 发表于 12-2-2010 16:11:46

难道是JAVA本身的bug??:lol :lol

wykdy 发表于 17-2-2010 00:51:29

原帖由 kawara 于 12-2-2010 15:45 发表 http://www.freeoz.org/bbs/images/common/back.gif

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

静态变量和静态初始化块都是在class的initialization阶段被执行的,也就是报错信息中的Clinit方法,这个方法是java编译生成的内部方法,外部无法直接调用。至于执行顺序一般是按照在代码中出现的顺序执行。
页: [1]
查看完整版本: java static initialization 大家怎么初始化static collections