我已经将我的arduino代码串行连接到处理。我得到一个运行时错误,在处理中显示NullPointerException。
import processing.serial.*;
Serial myPort;
String val ;
int[] colour_val ;
void setup(){
size(500,500);
String portName = Serial.list()[0];
myPort = new Serial(this, portName, 9600);
}
void draw(){
if (myPort.available() >0){
val = myPort.readStringUntil('\n');
}
if (val != null){
append(colour_val,val);
for ( float v : colour_val)
background(v);
}
}
答案 0 :(得分:0)
看看这个变量:
int[] colour_val;
您没有给它一个值,所以默认情况下它没有任何价值,或null
值。
现在看看这一行:
append(colour_val, val);
您已将null
传递到append()
功能。您可能希望添加该值,以便拥有单索引数组,但这不是它的工作原理。您无法将null
传递给此功能,或者您将获得NullPointerException
。
要解决此问题,只需将colour_val
变量初始化为空数组而不是null
:
int[] colour_val = new int[0];
但即使你解决了这个问题,你还有另外一个问题。 append()
函数实际上并未更改传递给它的数组。相反,它会创建一个新数组并返回该数组。您必须将此新数组存储到变量中。您可以将其存储在同一个变量中:
colour_val = append(colour_val,val);
可以在the reference找到更多信息。
这与您的问题无关,但请查看以下代码部分:
for ( float v : colour_val)
background(v);
这并没有多大意义。假设你的colour_val
数组中有3个值:0,128和255.这个循环就像连续3次调用background()
函数一样:
background(0);
background(128);
background(255);
但请注意,前两次拨打background()
的确没有做任何事情,因为您最后一次调用background()
函数就会立即将其抽出。用户只能看到background()
的最后一次通话,因此您真的不需要此循环。