方法中的这一特定行引发了一个NPE,我坚持了两天:
List<Peak>[] peaks = (List<Peak>[]) new ArrayList[samples.length/Spectra.spectraInterval];
行发生的方法是:
public static List<Peak>[] getPeaks(AudioClip clip) {
double[] samples = clip.getSamples();
List<Peak>[] peaks = (List<Peak>[]) new ArrayList[samples.length/Spectra.spectraInterval];
peaks[0] = new ArrayList<Peak>();
for (int i = 1; i < peaks.length; i++) {
Spectra s = new Spectra(i, Arrays.copyOfRange(
samples,
i*Spectra.spectraInterval - Spectra.samplesPerSpectra/2,
i*Spectra.spectraInterval + Spectra.samplesPerSpectra/2
));
peaks[i] = s.getPeaks();
//System.out.println(peaks[i]);
}return peaks;
}
此方法是类Extractor的一部分,它提取两个峰与探针配对所需的时间差。我的问题是:
Pl帮助。我是Java新手,只是在一个类似Shazam的代码中工作,这个代码有一个音频文件输入 - 尝试用不同类中的麦克风输入替换它。
答案 0 :(得分:0)
尝试使用一些日志进行调查(也许样本为空?):
System.out.println("samples = " + samples + ", interval = " + Spectra.spectraInterval);
List<Peak>[] peaks = (List<Peak>[]) new ArrayList[samples.length/Spectra.spectraInterval];
答案 1 :(得分:0)
如果某个对象调用了某个值,则会引发NPE,其值为null
。 (方法,属性)。
在你的情况下,这一行有两个这样的电话:
samples.length
和Spectra.spectraInterval
。
Spectra.spectraInterval
似乎是一个静态调用,即使spectraInterval
的值为null
,也不会引发NPE。 (因为返回空值绝对合法。)
另一方面,samples
数组来自AudioClip
。检查是否存在值并处理它,如果没有。
,例如,
public static List<Peak>[] getPeaks(AudioClip clip) {
double[] samples = clip.getSamples();
if(samples == null || samples.length == 0) {
return Collections.emptyList().toArray();
}
List<Peak>[] peaks = (List<Peak>[]) new ArrayList[samples.length/Spectra.spectraInterval];
peaks[0] = new ArrayList<Peak>();
for (int i = 1; i < peaks.length; i++) {
Spectra s = new Spectra(i, Arrays.copyOfRange(
samples,
i*Spectra.spectraInterval - Spectra.samplesPerSpectra/2,
i*Spectra.spectraInterval + Spectra.samplesPerSpectra/2
));
peaks[i] = s.getPeaks();
//System.out.println(peaks[i]);
}
return peaks;
}