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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:48:19