方法中的这一行抛出了一个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类的一部分,该类提取两个峰配对到探针所需的时间差。我的问题是
- 峰值对象创建错误吗?还是转换成数组列表错误?
- 是由于样品引起的NPE。长度(在另一个类声明)返回null?
Pl的帮助。我是Java的新手,只是在一个类似shazam的代码周围工作,这个代码有一个音频文件输入-试图用一个不同类中的麦克风输入来取代它。
尝试使用一些日志(可能samples是null?):
System.out.println("samples = " + samples + ", interval = " + Spectra.spectraInterval);
List<Peak>[] peaks = (List<Peak>[]) new ArrayList[samples.length/Spectra.spectraInterval];
如果在值为null
的对象上调用某项操作,则引发NPE。(方法、属性).
在这一行中有两个这样的调用:samples.length
和Spectra.spectraInterval
.
Spectra.spectraInterval
似乎是一个静态调用,它不会引发NPE,即使spectraInterval
的值是null
。(因为返回空值是绝对合法的)
另一方面,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;
}