首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有列表接口的泛型数组中的NPE

具有列表接口的泛型数组中的NPE
EN

Stack Overflow用户
提问于 2016-10-20 09:00:23
回答 2查看 152关注 0票数 0

方法中的这个特定行抛出一个NPE,我在它上停留了两天:

代码语言:javascript
复制
List<Peak>[] peaks = (List<Peak>[]) new ArrayList[samples.length/Spectra.spectraInterval];

出现行的方法是:

代码语言:javascript
复制
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;


}

这种方法是一个类的一部分,提取出两个峰值配对成探针所需的时间差。我的问题是:

  1. 山顶对象创建是错误的吗?还是把ArrayList转换错了?
  2. NPE是由于samples.length (在另一个类中声明)返回null吗?

我帮你。我对Java很陌生,只是在一个类似Shazam的具有音频文件输入的代码中工作,试图用一个不同类中的麦克风输入来替换它。

EN

回答 2

Stack Overflow用户

发布于 2016-10-20 09:20:22

尝试使用一些日志(可能示例为null?):

代码语言:javascript
复制
System.out.println("samples = " + samples + ", interval = " + Spectra.spectraInterval);  
List<Peak>[] peaks = (List<Peak>[]) new ArrayList[samples.length/Spectra.spectraInterval];
票数 0
EN

Stack Overflow用户

发布于 2016-10-20 09:33:25

如果在值为null的对象上调用了某些内容,则会引发NPE。(方法、属性)。

在您的例子中,在这一行中有两个这样的调用:

samples.lengthSpectra.spectraInterval.

Spectra.spectraInterval似乎是一个静态调用,它不会引发NPE,即使spectraInterval的值是null。(因为返回空值是完全合法的。)

另一方面,samples数组来自AudioClip。检查是否有价值存在,并处理它,如果没有。

例如,

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40149889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档