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

Processing运行时触发java.lang.NullPointerException:this.list为空的解决求助

解决Processing串口代码的空指针异常问题

问题根源

你的代码触发java.lang.NullPointerException的核心原因:

  • 串口通信并非每次draw()循环都能读到有效数据,当myString为null时,split(myString, ',')会返回null,后续访问list[0]、list[1]直接触发空指针异常。
  • 即使读到myString,也无法保证数据是"数字,数字"的合规格式,若拆分后数组长度不足2,同样会报错。
  • 额外性能问题:createFont("Arial", 64)放在draw()里会重复创建字体,拖慢运行效率。

修改后的代码

import processing.serial.*;

Serial port;
String[] list;
String myString = null;
int ai, bi;
PFont f; // 提前声明字体变量
  
void setup(){
  fullScreen();
  //size(800, 500);
  
  port = new Serial(this, "COM6", 9600);
  port.clear();
  
  // 字体仅初始化时创建一次
  f = createFont("Arial", 64);
  textFont(f);
  textSize(90);
}

void draw(){
  background(0);
  
  // 读取串口数据,保留最后一行有效数据
  while (port.available() > 0) {
    myString = port.readStringUntil('\n');
    // 清理字符串两端的空白和换行符
    if(myString != null){
      myString = trim(myString);
    }
  } 
  
  // 核心校验:仅当数据有效时才处理
  if(myString != null){
    list = split(myString, ',');
    // 确保拆分后至少有2个元素
    if(list.length >= 2){
      try{
        // 捕获数字转换失败的异常
        float a = float(list[0]);
        float b = float(list[1]);
        ai = round(a);
        bi = round(b);
        
        println("Displacement: " + ai + " mm " + "Pressure: " + bi + " kg");
        text("Displacement: " + ai + " mm ", 10, 100);
        text("Pressure: " + bi + " kg ", 10, 200);
      } catch(NumberFormatException e){
        println("数据格式错误,请检查串口输出");
      }
    } else {
      println("数据长度不足,请检查串口输出格式");
    }
  } else {
    // 无数据时的提示(可选)
    text("等待串口数据...", 10, 100);
  }
}

关键修改说明

  • 非空判断:处理myString和list前先校验是否为null,从根源避免空指针。
  • 格式校验:检查list长度是否达标,确保能安全访问数组元素。
  • 异常捕获:用try-catch处理数字转换失败的情况,避免格式错误导致程序崩溃。
  • 性能优化:字体创建移至setup(),避免重复创建资源。
  • 数据清理:用trim()去除无效空白字符,防止拆分出空元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:31:04