注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

让一切都逝去吧

排骨炖泥菜/猪肝炒苹果/鱼籽狗肉汤/狗头薏米汤

 
 
 

日志

 
 

java.lang.ExceptionInInitializerError  

2014-07-16 10:34:15|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      如题所示错误,这个错误主要是静态对象的加载依赖问题,在创建某个静态对象是,它所依赖的对象可能还未创建。网上就是简单好理解的例子
import java.util.HashMap;
import java.util.Map;

public class Example {

    private static Example example = new Example();

    private static Map<Integer,Boolean> test =
        new HashMap<Integer, Boolean>();

    private Example(){
        test.put(1, true);
    }

    public static Example getInstance(){
        return example;
    }
}
创建example对象时,去调用Example构造方法,构造方法里又去访问test变量,这时test对象还未创建。解决方法,就是把example和test的位置调转一下就行了。

      而手头项目出现这个错误却不好查,其中有些native方法看不到源码。项目中用到jaxb,在junit测试用例中,直接使用了jdk自己的实现,就是com.sun.xml.internal.bind.v2.ContextFactory。而部署到web容器,期望用下面的实现
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2.7</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.7</version>
 </dependency>
可以配置src\main\resources\META-INF\services\javax.xml.bind.JAXBContext文件,文件内容是
com.sun.xml.bind.v2.ContextFactory
可是META-INF\services\配置貌似对于junit启动的代码无效,另外由于当前项目并不需要jaxb-impl依赖(项目作为jar包发布到其他项目中),于是实现时使用下面方式处理这个问题:
try {
Class.forName("com.sun.xml.bind.v2.ContextFactory");//尝试加载jaxb包
System.setProperty("javax.xml.bind.JAXBContext", "com.sun.xml.bind.v2.ContextFactory");
} catch (ClassNotFoundException e1) {
System.setProperty("javax.xml.bind.JAXBContext", "com.sun.xml.internal.bind.v2.ContextFactory");
}
  评论这张
 
阅读(681)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017