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

Processing草图中WebSocket相关NullPointerException问题排查

解决Processing语音识别消息不更新到Draw窗口的问题

我一眼就看出你代码里的几个关键问题,咱们一步步来解决:

问题根源拆解

  • 变量名冲突:你的webSocketServerEvent方法参数叫msg,和全局变量msg重名了!这导致你在方法里打印的是局部参数,根本没更新全局的msg变量,draw自然拿不到新内容。
  • 绘图刷新机制:你加了noLoop(),这会让draw只执行一次,就算全局变量更新了,窗口也不会重新渲染新文本。
  • 空指针预防:虽然你在setup里加了null判断,但其实直接给全局变量初始化默认值会更简洁稳妥。

修正后的完整代码

import websockets.*;
WebsocketServer socket;
PFont f;
// 直接初始化全局变量,避免空指针
String msg = "test"; 

void setup() {
  socket = new WebsocketServer(this, 1337, "/p5websocket");
  size(480, 120);
  f = createFont("Arial",16,true); 
}

void draw() {
  background(100);
  textFont(f,36);
  fill(180);
  println(msg);
  text(msg, 10, 40); // 调整y坐标让文本显示更合理,也可以保留你的文本框参数
}

// 修改参数名,避免和全局变量冲突,同时更新全局msg并触发重绘
void webSocketServerEvent(String receivedMsg){
  println("收到语音消息:" + receivedMsg);
  msg = receivedMsg;
  redraw(); // 强制触发draw方法刷新窗口
}

关键修改说明

  1. 全局变量初始化:把String msg;改成String msg = "test";,从根源避免NullPointerException,不用再在setup里做额外判断。
  2. 修复变量冲突:将webSocketServerEvent的参数名改为receivedMsg,然后把全局msg赋值为这个新收到的内容。
  3. 触发绘图刷新:在收到新消息后调用redraw(),这样draw会立即执行一次,把最新的msg显示在窗口上。如果需要持续刷新也可以去掉noLoop(),但用redraw()更高效,只在有新消息时更新。

这样修改后,你麦克风输入的内容就能实时更新到Processing窗口里啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:58:59