Audio 处理和音频输入的NullPointerException

Audio 处理和音频输入的NullPointerException,audio,nullpointerexception,processing,Audio,Nullpointerexception,Processing,我正在制作一个处理草图,从一个音频文件中获取输入,我将其主频映射到三条动画“蛇”的运动。代码有时工作正常,有时工作不正常(NullPointerException)!我想这与一些细节有关,我丢失了/没有得到,但我感到困惑,因为我的代码并不是每次都中断!!如果你能检查一下并找出问题所在,我将不胜感激! 以下是主要示意图: 导入珠子。*; //声音变量 音频背景ac; 增益g; 功率谱; 频率f; 字符串源文件; 样本播放器; 浮点输入频率; 浮动频率; 浮动频率; //可视变量 沙培沙1号; 沙皮

我正在制作一个处理草图,从一个音频文件中获取输入,我将其主频映射到三条动画“蛇”的运动。代码有时工作正常,有时工作不正常(NullPointerException)!我想这与一些细节有关,我丢失了/没有得到,但我感到困惑,因为我的代码并不是每次都中断!!如果你能检查一下并找出问题所在,我将不胜感激! 以下是主要示意图:

导入珠子。*;
//声音变量
音频背景ac;
增益g;
功率谱;
频率f;
字符串源文件;
样本播放器;
浮点输入频率;
浮动频率;
浮动频率;
//可视变量
沙培沙1号;
沙皮亚沙二段;
沙培沙3号;
布尔值SHA1压缩,SHA2压缩,SHA3压缩;
无效设置(){
大小(900600);
帧速率(30);//不影响声音
输入频率=0;
mappedFrequency=0;
频率=0;
//获取声源
ac=新的AudioContext();
sourceFile=sketchPath(“”+“data/rite1.mp3”;
试一试{
player=newsampleplayer(ac,newsample(sourceFile));
}
捕获(例外e)
{
println(“尝试加载样本时出现异常!”);
e、 printStackTrace();
退出();
}
g=新增益(ac,2,0.3);
g、 附加输入(玩家);
交流输出附加输入(g);
/*获得主频的先决条件*/
ShortFrameSegmenter sfs=新的ShortFrameSegmenter(ac);
sfs附加输入(ac.out);
FFT=新的FFT();
sfs.addListener(fft);
ps=新的功率谱();
fft.addListener(ps);
f=新频率(44100.0f);
ps.addListener(f);
ac.out.addDependent(sfs);
/*先决条件结束*/
ac.start();
光滑的();
仰泳();
//冲程权重(2);//影响点的大小
shA1=新形状a(3);//影响角度的随机因素
shA2=新的形状a(6);
shA3=新形状a(8);
shA1pressed=false;
shA2pressed=false;
shA3pressed=false;
}
作废提款(){
//背景(255);
填充(255,10);
矩形(0-10,0-10,宽度+20,高度+20);
text(“输入频率:,-100,-100);//出于某种原因,需要!!
inputFrequency=f.getFeatures();//**这是主频率**
mappedFrequency=map(inputFrequency,202000,0,20);//计算能力!
如果(shA1pressed){
shA1.angle();
shA1.显示(shA1.角度);
}  
如果(shA2pressed){
shA2.angle();
shA2.显示(shA2.角度);
}
如果(shA3pressed){
shA3.angle();
shA3.显示(shA3.角度);
}
prevFrequency=输入频率;
}
按下void键(){
如果(键=='1'){
if(shA1pressed==false){
shA1pressed=true;
}否则{
shA1pressed=false;
}
}
如果(键=='2'){
if(shA2pressed==false){
shA2pressed=true;
}否则{
shA2pressed=false;
}
}
如果(键=='3'){
如果(shA3pressed==false){
shA3pressed=true;
}否则{
shA3pressed=false;
}
}
}
这是ShapeA课程:

类ShapeA{
浮动角度计数=7;
浮动步长=3.3;
int i=0;
浮动角度=弧度(270);
浮子r;
ArrayList points=新的ArrayList();
形状a(浮动_r){
//设置第一点的位置
添加(新PVector(随机(宽度)、随机(高度));
r=\u r;
}
浮动角(){
如果(频率=高度){
角度=a-90;
}

否则,如果(x将来,你应该试着发布你得到的任何错误的全文,以及你正在使用的库的链接

但我有一个理论:

该类有一个名为的函数,该函数返回一个
浮点值

请注意,
Float
中的大写字母F。它是一个对象,而不是原始小写字母
Float
,这意味着它可以为null

然后,当您将其转换为小写的
float
(通过取消装箱),您会得到
NullPointerException
,因为它不知道如何将
null
转换为
float

我不知道该函数返回null的原因;您必须检查文档并对此进行调试。但是您必须跟踪原因并防止它,或者必须添加null检查,只有在值为非null时才输入代码。类似于:

Float returnedFrequency=f.getFeatures();
if(返回频率!=null){
输入频率=返回频率;
//代码的其余部分
至于你为什么需要
text()
函数,我猜这只是一个巧合。我猜可能它对
频率
类中需要发生的任何事情都造成了足够的延迟,但是延迟应该只有几毫秒,所以我真的怀疑这种情况。无论如何,如果你追踪空值的原因,这将成为一个没有意义的点或者添加一个空检查


顺便说一句,您在这里发布了一堆额外的代码-您的问题与键盘无关,因此所有这些代码都将您的问题弄得一团糟。下次,尝试创建一个-只有几行代码,我们可以运行它来得到相同的错误,而不是您的整个草图。祝您好运。

似乎在安装()之前调用draw()。如果是这种情况,穷人的解决方案是使用布尔变量:在setup()结束时将其设置为true,如果未设置,则在draw()中提前返回。谢谢,Kevin!你的理论很有道理!我尝试了你的代码,现在没有出现错误。关于text()函数,它似乎确实是一个延迟的情况,因此text()对此进行了补偿。我将draw()代码设置为在特定的帧数后运行,似乎效果很好。我还将考虑您的MCVE注释。谢谢。