具有List接口的通用数组中的NPE

时间:2016-10-20 09:00:24

标签: java list generics

方法中的这一特定行引发了一个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. Peak对象创建错误了吗?或转换为ArrayList错误?
  2. 由于samples.length(在另一个类中声明)的NPE是否返回null?
  3. Pl帮助。我是Java新手,只是在一个类似Shazam的代码中工作,这个代码有一个音频文件输入 - 尝试用不同类中的麦克风输入替换它。

2 个答案:

答案 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.lengthSpectra.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;
}