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 简直就是噩梦。搞不懂那么多大企业都喜欢 代码看不懂的人帮顶:lol 如果只是为了看起来好看,可以放在另一个静态方法里面。
或者把你的hash map 里面的东西 全放到一个 enum 里面更好。因为全是常量嘛。 public static HashMap statusDisplaysMap;
static {
statusDisplaysMap=new HashMap();
初始化 statusDisplaysMap
} 楼主的那个应该也行的,能把错误信息贴出来么? 原帖由 清风不写字 于 11-2-2010 17:03 发表 http://www.freeoz.org/bbs/images/common/back.gif
如果只是为了看起来好看,可以放在另一个静态方法里面。
或者把你的hash map 里面的东西 全放到一个 enum 里面更好。因为全是常量嘛。
假设用我第一种方法,那调用那个map 是不是应该静态调用啊,不需要创建个object吧。
我明天上班看看log再把错误信息帖上来 原帖由 kawara 于 11-2-2010 17:08 发表 http://www.freeoz.org/bbs/images/common/back.gif
public static HashMap statusDisplaysMap;
static {
statusDisplaysMap=new HashMap();
初始化 statusDisplaysMap
}
你的这个和我报错的那个没区别啊? 原帖由 lufumin1832 于 11-2-2010 19:27 发表 http://www.freeoz.org/bbs/images/common/back.gif
假设用我第一种方法,那调用那个map 是不是应该静态调用啊,不需要创建个object吧。
不用创建object,不过创建了也不应该出错 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第一种方法的错误信息 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 发表 http://www.freeoz.org/bbs/images/common/back.gif
肯定是别的原因,不过既然有了解决办法,就不用深究了
不知道原因,我睡不好,老想着:'( 能把
初始化 statusDisplaysMap
这句写得稍微清楚一些吗?
这个伪代码太伪了 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");
}
} 你的程序没有问题,应该也不是Struts或者Tomcat的问题 :'( :'( :'( :'( :'( 原帖由 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 次序不确定。 原帖由 kawara 于 12-2-2010 15:45 发表 http://www.freeoz.org/bbs/images/common/back.gif
不能,静态变量初始化和静态初始化块是在class load时候进行的。并不是在用哪个class之前才load的。class loading 次序不确定。
现在的问题是次序很确定
一种可以,另一种咋都不行 原帖由 kawara 于 12-2-2010 15:45 发表 http://www.freeoz.org/bbs/images/common/back.gif
不能,静态变量初始化和静态初始化块是在class load时候进行的。并不是在用哪个class之前才load的。class loading 次序不确定。
你的意思是静态初始化的时候是不能引用别的class的静态常量的,只能用自己class的静态常量,如果是这样就可以理解了 原帖由 kawara 于 12-2-2010 15:45 发表 http://www.freeoz.org/bbs/images/common/back.gif
不能,静态变量初始化和静态初始化块是在class load时候进行的。并不是在用哪个class之前才load的。class loading 次序不确定。
如果这样,那他的第二种也应该出错啊。 没用过java,不过据我多年的C++/C#应用经验,思想应该是一样的。原则是静态成员变量一般都由静态成员函数初始化,比如静态构造函数,非静态成员函数可以调用静态成员变量,静态成员初始化应在class被第一次使用的时候(实例化或调用静态成员函数)。 建议lz定义static的构造函数,在里面初始化静态成员变量吧,代码规约很重要的:lol 原帖由 清风不写字 于 12-2-2010 16:30 发表 http://www.freeoz.org/bbs/images/common/back.gif
如果这样,那他的第二种也应该出错啊。
是啊,要是这样第二种也应该报错才对啊,晕了 原帖由 beysup 于 12-2-2010 16:52 发表 http://www.freeoz.org/bbs/images/common/back.gif
没用过java,不过据我多年的C++/C#应用经验,思想应该是一样的。原则是静态成员变量一般都由静态成员函数初始化,比如静态构造函数,非静态成员函数可以调用静态成员变量,静态成员初始化应在class被第一次使用的时候 ...
我不是图方便,而且初始化一次就不变了 难道是JAVA本身的bug??:lol :lol 原帖由 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]