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

调用Calculations对象时出现NullPointerException问题求助

骰子投掷程序NullPointerException问题排查

我正在开发一款骰子投掷程序,其他功能(变量设置、输出顺序)都正常,但访问Calculations对象时触发报错。

报错信息

java.lang.NullPointerException: Cannot invoke "Final_Project$Calculations.finalcalc()" because "this.c" is null
at Final_Project.startScreen(Final_Project.java:68)
at Final_Project.keyPressed(Final_Project.java:80)

我的代码

Calculations c;
int stage = 0;
int number;
int die;
int mod;
int modnum;
int inc = 0;
int[] num = new int[20];
boolean plusminus;
int spot = 0;
void setup() {
  startScreen(inc);
}

void draw() {
}
//initial prompt screen
void startScreen(int stage) {
  switch(stage) {
  case 0:
    println("How many dice? (up to 9)");
    break;
  case 1:
    number = num[spot];
    //noLoop();
    println("Modifiers? (press + or -)");
    break;
  case 2:
    mod = num[spot];
    if (mod == 10) {
      plusminus = true;
    } 
    if (mod == 11) {
      plusminus = false;
    }
    //noLoop();
    println("how much?");
    //loop();
    break;
  case 3:
    modnum = num[spot];
    //noLoop();
    println("which dice? (1 = d2, 2 = d3, 3 = d4, 4 = d6, 5 = d8, 6 = d10, 7 = d12, 8 = d20, 9= d100");
    break;
  case 4:
    die = num[spot];
    c.finalcalc();
    break;
  }
}

void keyPressed() {

  if (keyPressed) {
    if (keyCode == ENTER) {
      inc++;
      loop();
      startScreen(inc);
      noLoop();
    }

    if (keyCode != ENTER) {
      if (key == '1') {
        num[spot] = 1;
        println(num[spot]);
      } else if (key == '2') {
        num[spot] = 2;
        println(num[spot]);
      } else if (key == '3') {
        num[spot] = 3;
        println(num[spot]);
      } else if (key == '4') {
        num[spot] = 4;
        println(num[spot]);
      } else if (key == '5') {
        num[spot] = 5;
        println(num[spot]);
      } else if (key == '6') {
        num[spot] = 6;
        println(num[spot]);
      } else if (key == '7') {
        num[spot] = 7;
        println(num[spot]);
      } else if (key == '8') {
        num[spot] = 8;
        println(num[spot]);
      } else if (key == '9') {
        num[spot] = 9;
        println(num[spot]);
      } else if (key == '+') {
        num[spot] = 10;
        println(num[spot]);
      } else if (key == '-') {
        num[spot] = 11;
        println(num[spot]);
      }
    }
  }
}

class Calculations {
  int dice() {
    int i = 0;
    if (die == 1) {
      i = round(random(2));
    }
    if (die == 2) {
      i = round(random(3));
    }
    if (die == 3) {
      i = round(random(4));
    }
    if (die == 4) {
      i = round(random(6));
    }
    if (die == 5) {
      i = round(random(8));
    }
    if (die == 6) {
      i = round(random(10));
    }
    if (die == 7) {
      i = round(random(12));
    }
    if (die == 8) {
      i = round(random(20));
    }
    if (die == 9) {
      i = round(random(100));
    }
    return i;
  }
  int finalcalc() {
    int[] roll = new int[key];
    int result = 0;
    for (int i = 0; i > roll.length; i++) {
      roll[i] = dice();
      if (plusminus == true) {
        result = dice() + modnum;
      }
      if (plusminus == false) {
        result = dice() - modnum;
      }
    } 
    return result;
  }
}

问题修复方案

  • 核心空指针问题:声明了Calculations c;但从未初始化对象,导致调用c.finalcalc()时触发异常。在setup()中添加初始化代码:
    void setup() {
      c = new Calculations();
      startScreen(inc);
    }
    
  • 输入覆盖问题:用户按回车进入下一阶段时,spot变量未递增,后续输入会覆盖之前的数组值。在keyPressed()的ENTER分支添加:
    if (keyCode == ENTER) {
      inc++;
      spot++;
      loop();
      startScreen(inc);
      noLoop();
    }
    
  • finalcalc逻辑修复:
    1. 数组初始化错误:int[] roll = new int[key];改为int[] roll = new int[number];,用输入的骰子数量作为数组长度。
    2. 循环条件错误:for (int i = 0; i > roll.length; i++)改为i < roll.length,否则循环不会执行。
    3. 结果计算逻辑错误:当前每次循环会覆盖结果,需累加所有骰子值后再应用 modifier。修改后的方法:
      int finalcalc() {
        int[] roll = new int[number];
        int total = 0;
        for (int i = 0; i < roll.length; i++) {
          roll[i] = dice();
          total += roll[i];
          println("骰子" + (i+1) + ": " + roll[i]);
        }
        if (plusminus) {
          total += modnum;
        } else {
          total -= modnum;
        }
        println("最终结果: " + total);
        return total;
      }
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:11:05