如何在Processing中摆脱NullPointerException?

时间:2016-08-01 18:22:10

标签: arduino processing

我已经将我的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);
   }
}  

1 个答案:

答案 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()的最后一次通话,因此您真的不需要此循环。