我正在处理3.3中的矩阵文本降雨效果,作为学习处理库和Java的简单入门项目。到目前为止我的代码:
class Symbol {
int x, y;
int switchInterval = round(random(2, 50));
float speed;
char value;
Symbol(int x, int y, float speed) {
this.x = x;
this.y = y;
this.speed = speed;
}
//Sets to random symbol based on the Katakana Unicode block
void setToRandomSymbol() {
if(frameCount % switchInterval == 0) {
value = char((int) random(0x30A0, 0x3100));
}
}
//rains the characters down the screen and loops them to the top when they
// reach the bottom of the screen
void rain() {
if(y <= height) {
y += speed;
}else {
y = 0;
}
}
}
Symbol symbol;
class Stream {
int totalSymbols = round(random(5, 30));
Symbol[] symbols = new Symbol[500];
float speed = random(5, 20);
//generates the symbols and adds them to the array, each symbol one symbol
//height above the one previous
void generateSymbols() {
int y = 0;
int x = width / 2;
for (int i = 0; i <= totalSymbols; i++) {
symbols[i] = new Symbol(x, y, speed);
symbols[i].setToRandomSymbol();
y -= symbolSize;
}
}
void render() {
for(Symbol s : symbols) {
fill(0, 255, 70);
s.setToRandomSymbol();
text(s.value, s.x, s.y);
s.rain();
}
}
}
好的,这就是很多代码,让我解释一下我的困境。我遇到的问题是,当我运行代码时,我在render函数中for each循环的s.setToRandomSymbol();
方法调用中得到一个NullpointerException。关于这个NullPointerException错误以及我不理解的部分的奇怪部分是它被抛出一个方法,该方法不会接受任何可能返回空的参数,并且该方法本身是无效的,所以它不应该返回任何东西,对吧?为什么这个返回Null,我做错了让它以这种方式返回?
答案 0 :(得分:2)
首先,你在5和30之间得出一个随机数:
int totalSymbols = round(random(5,30));
然后,您创建一个包含500
类的Symbol
个实例的数组:
Symbol[] symbols = new Symbol[500];
请注意,此数组此时包含500 null
个值。
然后,您的数组最多可添加30个Symbol
个实例:
for (int i = 0; i <= totalSymbols; i++) {
symbols[i] = new Symbol(x, y, speed);
请注意,此时此数组至少包含470 null
个值。
然后迭代所有500个索引:
for(Symbol s : symbols) {
s.setToRandomSymbol();
但请记住,这些索引中至少有470个是null
,这就是您获得NullPointerException
的原因。
一些基本的调试会告诉你所有这些。我会在你收到错误之前添加一个基本的println()
语句开始:
for(Symbol s : symbols) {
println("s: " + s);
s.setToRandomSymbol();
这会向您显示您正在重复null
个值。
无论如何,为了解决您的问题,您需要停止迭代整个阵列,或者您需要停止为从未使用的索引腾出空间。
将来,请尝试在发布前将问题范围缩小到MCVE。请注意,这个小得多的示例程序会显示您的错误:
String[] array = new String[10];
array[0] = "test";
for(String s : array){
println(s.length());
}