调用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逻辑修复:
- 数组初始化错误:
int[] roll = new int[key];改为int[] roll = new int[number];,用输入的骰子数量作为数组长度。 - 循环条件错误:
for (int i = 0; i > roll.length; i++)改为i < roll.length,否则循环不会执行。 - 结果计算逻辑错误:当前每次循环会覆盖结果,需累加所有骰子值后再应用 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
相关产品推荐
相关产品推荐

