2016-08-01 33 views
0

我已经连接我的arduino代码串行处理。我得到一个运行时错误,说明处理中的NullPointerException。如何在处理中摆脱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

看这个变量:

int[] colour_val; 

你不给它的值,所以默认它没有什么,或者null值。

现在看这条线:

append(colour_val, val); 

你传递nullappend()功能。您可能期望添加该值,以便您拥有单索引数组,但这不是它的工作原理。你不能通过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这个循环就像调用background()功能3次连续:

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

但要注意的是,前两个电话给background()不要”不要做任何事情,因为你立即通过最后一次调用background()函数来吸引他们。用户只会看到最后一次拨打background(),所以你真的不需要这个循环。