OpenProcessing上Processing草图运行时页面崩溃问题求助
问题分析与修复方案
我帮你排查了代码里的几个关键问题,正是这些问题导致页面冻结无响应,甚至连打印语句都没机会输出:
1. 海量无效输出导致浏览器卡顿
这是页面冻结的核心原因:你初始化的a_combos和b_combos是int[][]类型,在Java/Processing中,基本类型数组初始化后,每个元素都会被默认分配一个空的int[]数组(不是null)。所以你写的if (a_combos[i] != null)判断永远为真,这会让两个打印循环各自输出10000行内容——浏览器的控制台根本处理不了这么多输出,直接就卡住了,连之前的打印语句都没机会执行。
2. 数组索引逻辑错误
在draw()函数里计算临时分数时,你写错了数组索引:
double atemp = a + combos[0]; // 错误:combos[0]是整个一维数组,不是第i个组合的第一个值
正确的写法应该是取当前循环的第i个组合的对应元素:
double atemp = a + combos[i][0]; double otemp = o + combos[i][1]; double utemp = u + combos[i][2]; double ktemp = k + combos[i][3];
之前的写法不仅逻辑完全错误(每次循环都用同一个组合计算),还会触发隐性类型转换(把数组转成数值),导致计算结果完全不符合预期。
3. 变量名拼写错误
最后一行打印语句里的变量名写错了:
println(10000 - failcount + ", " + failcount); // 错误:变量名是failcounter,不是failcount
这个错误会导致运行时异常,但因为前面的海量输出已经卡住了页面,所以你看不到错误提示。
4. fillCombos()的循环逻辑易混淆
虽然当前的循环理论上能生成10000个组合,但嵌套的递增判断顺序很容易让人混淆,而且如果后续修改数组长度,很容易出现计数溢出。
修复后的完整代码
我把上面的问题都修复了,还优化了组合计数的逻辑,避免无效遍历:
double a, o, u, k; int[][] combos; int[][] a_combos, b_combos; int failcounter; int aCount, bCount; // 记录有效组合的数量 void setup() { size(100,100); background(100); noLoop(); a = 2 + 4; o = 4 + 4; u = 3 + 4; k = 3 + 5; combos = new int[10000][4]; a_combos = new int[10000][4]; b_combos = new int[10000][4]; failcounter = 0; aCount = 0; bCount = 0; } void draw() { fillCombos(); for (int i = 0; i < combos.length; i++) { double atemp = a + combos[i][0]; double otemp = o + combos[i][1]; double utemp = u + combos[i][2]; double ktemp = k + combos[i][3]; double avg = (atemp + otemp + utemp + ktemp) / 4; if (avg >= 17) { a_combos[aCount++] = combos[i].clone(); // 克隆数组避免引用覆盖 } else if (avg >= 13.48) { b_combos[bCount++] = combos[i].clone(); } else { failcounter++; } } println("Getting an A:"); for (int i = 0; i < aCount; i++) { println(a_combos[i]); } println("Getting a B:"); for (int i = 0; i < bCount; i++) { println(b_combos[i]); } println("A or B versus C, D, or F:"); println(10000 - failcounter + ", " + failcounter); } // 用嵌套循环生成组合,更直观不易错 void fillCombos() { int index = 0; for (int q = 0; q < 10; q++) { for (int w = 0; w < 10; w++) { for (int e = 0; e < 10; e++) { for (int r = 0; r < 10; r++) { combos[index][0] = q; combos[index][1] = w; combos[index][2] = e; combos[index][3] = r; index++; } } } } }
额外建议
- 如果只是测试分数组合,其实不需要生成10000个数组元素,用嵌套循环直接计算即可,能节省内存和初始化时间。
- 可以把打印内容改成更易读的格式,比如
"[" + a_combos[i][0] + ", " + a_combos[i][1] + ", " + a_combos[i][2] + ", " + a_combos[i][3] + "]",避免控制台打印数组地址。
内容的提问来源于stack exchange,提问作者Brendan McDonnell
相关产品推荐
相关产品推荐

