具有列表接口的通用数组中的NPE



方法中的这一行抛出了一个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类的一部分,该类提取两个峰配对到探针所需的时间差。我的问题是

  1. 峰值对象创建错误吗?还是转换成数组列表错误?
  2. 是由于样品引起的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.lengthSpectra.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;
}

最新更新