使用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
相关产品推荐
相关产品推荐

