You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用org.apache.math3的NormalDistribution类时遭遇java.lang.NoClassDefFoundError

排查org.apache.math3.distribution.NormalDistribution的NoClassDefFoundError错误

错误重现

报错语句:

org.apache.commons.math3.distribution.NormalDistribution dis = new org.apache.commons.math3.distribution.NormalDistribution(0,1);

触发java.lang.NoClassDefFoundError,完整测试代码:

package com.src;
import org.apache.commons.math4.core.jdkmath.*;
import org.apache.commons.math4.legacy.distribution.*;
import org.apache.commons.math4.legacy.distribution.fitting.*;
public class Ztest {
  private boolean srs;
  private boolean independent;
  private boolean largeCounts;
  private double significanceLevel;
  private double testStatistic;
  private double pValue;
  private double nullProportion;
  private CategoricalDataSet data;
  public Ztest(boolean random, boolean percent, boolean big, double alpha, CategoricalDataSet d, double Ho, String direction) {
      srs = random;
      independent = percent;
      largeCounts = big;
      significanceLevel = alpha;
      nullProportion = Ho;
      data = d;
      testStatistic = (data.getProportion() - nullProportion)/data.standardError();
      org.apache.commons.math3.distribution.NormalDistribution dis = new org.apache.commons.math3.distribution.NormalDistribution(0,1);
      if(direction.equals("less than")) {
          pValue = dis.cumulativeProbability(testStatistic);
      }
      else if(direction.equals("greater than")) {
          pValue = dis.cumulativeProbability( -1.0 * testStatistic);
      }
      else {
          if(testStatistic > nullProportion) {
              pValue = 2.0 * dis.cumulativeProbability( -1.0 * testStatistic);
          }
          else {
              pValue = 2.0 * dis.cumulativeProbability(testStatistic);
          }
      }
  }
  public String summary() {
      String message;
      if(pValue < significanceLevel) {
          message = "Since the Pvalue is less than the signficance level, we have sufficient evidence to reject the null hypothesis (H0).";
      }
      else {
          message = "Since the Pvalue is greater than the significance level, we have insufficient evidence to reject the null hypthesis.";
      }
      return message;
  }
}

错误原因

  1. 依赖版本不匹配:代码中导入的是Apache Commons Math4的包(org.apache.commons.math4.*),但尝试实例化的是Math3的NormalDistribution类,且项目未正确引入Math3的依赖,导致JVM无法找到该类的字节码文件。
  2. 包路径混淆:Math4将旧版兼容API放在legacy子包下,其正态分布类路径为org.apache.commons.math4.legacy.distribution.NormalDistribution,无需跨版本使用Math3的类。

解决方法

方法一:统一使用Math4 API(推荐)

  1. 修改实例化代码,直接使用已导入的Math4类:
// 因为已经导入了org.apache.commons.math4.legacy.distribution.*,可以直接简写
NormalDistribution dis = new NormalDistribution(0, 1);
  1. 确保项目只引入Math4依赖,移除多余的Math3依赖(若存在)。以Maven为例,添加依赖:
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math4</artifactId>
    <version>4.0</version> <!-- 可替换为最新稳定版 -->
</dependency>

方法二:强制使用Math3 API

  1. 引入Math3的依赖,以Maven为例:
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version> <!-- 最新稳定版 -->
</dependency>
  1. 移除不必要的Math4依赖,避免类路径冲突;若需同时使用两个版本,需明确区分包路径,避免混淆。

额外代码优化提示

双尾检验的逻辑存在错误:当前代码将testStatistic与nullProportion比较,正确逻辑应与0比较,修正后:

else {
    if(testStatistic > 0) {
        pValue = 2.0 * dis.cumulativeProbability(-1.0 * testStatistic);
    } else {
        pValue = 2.0 * dis.cumulativeProbability(testStatistic);
    }
}

内容的提问来源于stack exchange,提问作者Arnav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:53:24