java.lang.ExceptionInInitializerError 错误 解决方案

当在静态初始化块中出现了异常的时候,JVM会抛出 java.lang.ExceptionInInitializerError异常。

如果你了解Java中的静态变量,你会知道它们是在类加载的时候进行初始化的

如果在这个静态变量初始化的过程中出现了异常,那么就会抛出 java.lang.ExceptionInInitializerError异常。

楼主用的retrofit,像这样.在单例模式中实例retrofit报这错.


  retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .build();


因为BASE_URL(如:http://www.baidu.com)没有在最后加 “ / ”,所以就报错。

解决方法就是在后面加上“ / ” 就好了(如:http://www.baidu.com/)  


### java.lang.ExceptionInInitializerError 的原因及解决方案 #### 1. 异常的原因 `java.lang.ExceptionInInitializerError` 是一种特殊的 `Error` 类型,在 Java 静态初始化阶段发生。当类的静态变量、静态代码块或枚举常量在初始化时抛出未捕获的异常,JVM 将触发此错误[^1]。 这种错误的根本原因是底层发生了某种异常(通常是运行时异常),而这些异常未能被适当处理。例如: - 文件读取失败导致 `NullPointerException` 或者 `FileNotFoundException`。 - 数据库连接池配置不正确引发 `SQLException`。 - 属性文件加载失败引起 `IOException`。 #### 2. 解决方案详解 ##### (1)检查静态初始化逻辑 确保静态代码块内的操作不会抛出任何未经处理的异常。可以通过增加异常捕获机制来防止此类问题的发生。例如: ```java static { try { FileInputStream is = new FileInputStream("config.properties"); Properties properties = new Properties(); properties.load(is); } catch (Exception e) { System.err.println("Failed to initialize static resources: " + e.getMessage()); throw new RuntimeException(e); } } ``` 上述代码片段展示了如何通过捕获潜在的异常并将其转换为受控形式的方式减少 `ExceptionInInitializerError` 发生的可能性[^3]。 ##### (2)验证资源配置路径 如果问题是由于无法找到外部资源(如属性文件或数据库驱动程序)引起的,则需确认相关文件的位置是否正确。常见的情况包括但不限于: - **文件缺失**:目标文件可能不存在于指定路径下。 - **构建过程丢失**:即使源码中有配置文件,但在打包成 JAR 后可能会遗失。 针对这些问题可以采取如下措施: - 确认配置文件位于项目的 `src/main/resources` 路径下以便自动包含至最终产物中。 - 如果手动指定了绝对路径,请改为相对路径或者使用 ClassLoader 加载资源: ```java InputStream inputStream = getClass().getClassLoader().getResourceAsStream("servletDemo.properties"); if (inputStream != null) { prop.load(inputStream); } else { throw new FileNotFoundException("Property file not found."); } ``` 这段代码利用了 `ClassLoader.getResourceAsStream()` 方法动态获取嵌入式的属性文件,从而规避硬编码路径带来的风险[^4]。 ##### (3)重启环境与清理缓存 有时尽管一切设置看似无误但仍持续遭遇同样的错误消息。此时不妨考虑以下建议: - 清理 IDE 缓存以及重建项目; - 关闭再启动应用服务器(Tomcat/Jetty 等); - 删除旧版编译输出重新生成最新版本; 简单来说,“冷启动”往往能消除一些难以追踪的状态残留所造成的干扰[^4]。 #### 3. 示例代码修正对比 以下是基于前述讨论的一个改进后的完整例子: ```java public class DruidUtils { private static final DataSource DATASOURCE; static { InputStream stream = null; Properties props = new Properties(); try { // 使用 ClassLoader 来定位资源文件 stream = Thread.currentThread().getContextClassLoader() .getResourceAsStream("servletDemo.properties"); if (stream == null) { throw new IOException("Unable to locate property file 'servletDemo.properties'."); } props.load(stream); DATASOURCE = DruidDataSourceFactory.createDataSource(props); } catch (Exception ex) { throw new IllegalStateException("Initialization of data source failed.", ex); } finally { if (stream != null) { try { stream.close(); } catch (IOException ignored) {} } } } public static Connection getConnection() throws SQLException { return DATASOURCE.getConnection(); } } ``` 以上实现不仅增强了健壮性还提高了可维护性和移植能力[^2]。 --- 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值