java.lang.ExceptionInInitializerError的原因

简介: java.lang.ExceptionInInitializerError的原因

这个错误是说变量初始化出现问题,通常出现在静态变量尤其是单例模式。这种问题往往是初始化顺序不对造成的,下面举个简单的例子。

[java]  view plain  copy

  1. import java.util.HashMap;  
  2. import java.util.Map;  
  3.  
  4. public class Example {  
  5.  
  6.    private static Example example = new Example();  
  7.      
  8.    private static Map test =  
  9.        new HashMap();  
  10.      
  11.    private Example()  
  12.    {  
  13.        test.put(1, true);  
  14.    }  
  15.      
  16.    public static Example getInstance()  
  17.    {  
  18.        return example;  
  19.    }  
  20. }  

     如果你在别的类调用getInstance,就会报错ExceptionInInitializerError。这是因为类加载时不会为实例变量赋值,对象创建时不会为静态变量赋值。我们调用getInstance时,此类就开始加载,加载的时候不会为实例变量赋值,但是会按顺序给静态变量赋值,所以先为example赋值,然后为test赋值即初始化。但为example赋值时出现了个小插曲,它会调用构造方法创建一个对象。对象创建时不会为静态变量test赋值,而构造器内却已经调用test,于是报错了。

改为:

[java]  view plain  copy

  1. private static Map test =  
  2.        new HashMap();  
  3. private static Example example = new Example();  
相关文章
|
2月前
|
人工智能 物联网 API
ModelScope魔搭25年8月发布月报
🔥 这个夏天,开源热潮比气温更燃!Qwen3、GLM4.5、混元、Wan2.2、Qwen-Image等重磅模型密集发布,MoE、多模态、Agent、生图视频全爆发,ModelScope 全程 Day0 支持,生态持续进化中!
217 0
|
Web App开发 应用服务中间件 PHP
|
9月前
|
Devops Shell 网络安全
git使用之如何将一套代码同时推送至github|gitee|gitcode|gitlab等多个仓库-含添加ssh-优雅草央千澈完美解决-提供整体提交代码
git使用之如何将一套代码同时推送至github|gitee|gitcode|gitlab等多个仓库-含添加ssh-优雅草央千澈完美解决-提供整体提交代码
343 16
git使用之如何将一套代码同时推送至github|gitee|gitcode|gitlab等多个仓库-含添加ssh-优雅草央千澈完美解决-提供整体提交代码
|
消息中间件 Java 开发工具
消息队列 MQ使用问题之如何使用DefaultMQPushConsumer来消费消息
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
存储 Java 索引
|
人工智能 搜索推荐 API
[AI Perplexica] AI驱动的开源搜索引擎
探索Perplexica,一款由AI驱动的开源搜索引擎,了解其特点、使用方法以及如何安装。
[AI Perplexica] AI驱动的开源搜索引擎
|
缓存 Java
java使用MAT进行内存分析
java使用MAT进行内存分析
|
JavaScript 前端开发 定位技术
|
数据采集 领域建模 数据库
领域模型图(数据架构/ER图)
数据架构重要的输出是数据-实体关系图,简称 ER 图。ER 图中包含了实体(数据对象)、关系和属性 3 种基本成分。ER 图可以用来建立数据模型。如何准确的建立产品的数据模型,需要分解出业务需要什么样的数据。数据域的分解过程是站在业务架构的基础上,对业务域进行模型分析的过程。
1028 0
|
存储 缓存 Java
JAVA多线程 | 实现用户任务排队 | 预估排队时长
JAVA多线程 | 实现用户任务排队 | 预估排队时长
616 0
JAVA多线程 | 实现用户任务排队 | 预估排队时长