方法中的这个特定行抛出一个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;
}这种方法是一个类的一部分,提取出两个峰值配对成探针所需的时间差。我的问题是:
我帮你。我对Java很陌生,只是在一个类似Shazam的具有音频文件输入的代码中工作,试图用一个不同类中的麦克风输入来替换它。
发布于 2016-10-20 09:20:22
尝试使用一些日志(可能示例为null?):
System.out.println("samples = " + samples + ", interval = " + Spectra.spectraInterval);
List<Peak>[] peaks = (List<Peak>[]) new ArrayList[samples.length/Spectra.spectraInterval];发布于 2016-10-20 09:33:25
如果在值为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;
}https://stackoverflow.com/questions/40149889
复制相似问题