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

使用java.util.Random实现自定义MyRandom类时报NullPointerException求助

MyRandom类空指针异常修复方案

问题根因

你声明的Random类型成员变量randomGen仅做了定义,未完成实例化初始化。Java中引用类型的类成员变量默认初始值为null,调用randomGen.nextInt()、randomGen.nextDouble()时本质是调用空对象的成员方法,因此触发空指针异常。
IDE不会提示这个错误的原因是语法层面没有问题,只有运行时才会暴露空对象调用的问题。

修复方案

在类的构造方法中完成randomGen的实例化,同时可以补充参数合法性校验避免后续其他异常:

import java.util.Random;
public class MyRandom {

    // 仅保留必要的成员变量
    private final Random randomGen;
    // 建议不要把方法内的临时变量设为类成员,避免线程安全和变量污染问题

    public MyRandom(){ 
        // 构造方法内初始化Random实例
        this.randomGen = new Random();
    }
    

    public int nextNumber(int lower, int upper){ 
        // 补充参数合法性校验
        if (upper <= lower) {
            throw new IllegalArgumentException("上限必须大于下限");
        }
        // 方法内部用临时变量存储结果即可
        int nextNumber = randomGen.nextInt(upper - lower) + lower;
        return nextNumber;
    }

    public double nextDecimal(double lower, double upper){ 
        if (upper <= lower) {
            throw new IllegalArgumentException("上限必须大于下限");
        }
        double nextDecimal = randomGen.nextDouble()*(upper - lower) + lower;
        return nextDecimal;
    }
}

其他优化建议

  • 成员变量建议用private修饰,符合封装原则,避免外部随意修改
  • 方法执行前先校验传入的上下限参数合法性,避免生成不符合预期的结果或者触发IllegalArgumentException(当upper - lower为非正数时,nextInt方法会直接抛出异常)
  • 不要把方法运行的临时结果存储为类成员变量,多个线程同时调用同一个MyRandom实例时会出现变量覆盖的线程安全问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:18:04