如何摆脱处理中的 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()
,所以你真的不需要这个循环。
我已经将我的 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()
,所以你真的不需要这个循环。