2016-10-20 23 views
0

在方法此特定線拋出NPE,並且我卡在它兩天:NPE與List接口通用陣列

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; 


} 

該方法是一個類的一部分,提取器提取兩個峯進行探測配對所需的時間差。我的問題是:

  1. Peak對象創建是否錯誤?或者轉換爲ArrayList錯誤?
  2. NPE歸因於samples.length(在另一個類中聲明)是否返回null?

PI help。我對Java很陌生,只是繞着一個帶有音頻文件輸入的Shazam代碼工作 - 嘗試用不同類中的麥克風輸入代替它。

+1

我會檢查'samples'不是'null'在調試器。 –

+0

Spectra.spectraInterval是一個基元還是一個包裝?一個空包裝器也可以拋出一個NPE。 PS:不需要投射數組列表,即使是陣列) – AxelH

+2

發佈[MCVE]:發佈最低限度顯示您的問題。(寫一個最小的情況是一個很好的調試技術,這樣做很可能解決你的問題。) – c0der

回答

0

儘量調查,使用一些日誌(也許樣品爲空):

System.out.println("samples = " + samples + ", interval = " + Spectra.spectraInterval); 
List<Peak>[] peaks = (List<Peak>[]) new ArrayList[samples.length/Spectra.spectraInterval]; 
+0

樣品確實返回null。我將不得不檢查樣品的麥克風輸入代碼。 –

0

的NPE升高,如果事情被調用的對象,它的值是null上。 (方法,屬性)。

對於您的情況,此行中有兩個此類調用:
samples.lengthSpectra.spectraInterval

Spectra.spectraInterval似乎是一個靜態調用,這不會引發NPE,即使spectraIntervalnull。 (因爲它返回空值是絕對合法的。)

samples array另一方面來自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; 
} 
+0

樣本返回null。將像你提到的那樣檢查AudioClip類。 –