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
相关产品推荐
相关产品推荐

