如何摆脱处理中的 NullPointerException?

How do I get rid of NullPointerException in 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);
   }
}  

查看这个变量:

int[] colour_val;

你没有给它一个值,所以默认情况下它什么都没有,或者一个 null 值。

现在看这一行:

append(colour_val, val);

您正在将 null 传递给 append() 函数。您可能希望添加值以便拥有单索引数组,但事实并非如此。您不能将 null 传递给此函数,否则您将得到 NullPointerException.

要解决此问题,只需将 colour_val 变量初始化为空数组而不是 null:

int[] colour_val  = new int[0];

但即使在你解决了这个问题之后,你还有另一个问题。 append() 函数实际上并没有改变你传递给它的数组。相反,它会创建一个新数组并 returns 那个。您必须将这个新数组存储到一个变量中。您可以将它存储回同一个变量中:

colour_val = append(colour_val,val);

可以在 the reference 中找到更多信息。

这与您的问题没有太大关系,但请看这段代码:

for ( float v : colour_val)
     background(v);

这并没有多大意义。假设您的 colour_val 数组中有 3 个值:0、128 和 255。此循环就像连续调用 background() 函数 3 次:

background(0);
background(128);
background(255);

但是请注意,对 background() 的前两次调用实际上并没有做任何事情,因为您会在最后一次调用 background() 函数时立即将它们覆盖。用户只会看到最后一次调用 background(),所以你真的不需要这个循环。