2016-10-20 6 views
0

Diese besondere Linie in einem Verfahren zur Herstellung eines NPE wirft, und ich bin auf sich zwei Tage lang fest:NPE in generischen Array mit Liste Schnittstelle

List<Peak>[] peaks = (List<Peak>[]) new ArrayList[samples.length/Spectra.spectraInterval]; 

Das Verfahren, bei dem die Leitung auftritt:

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; 


} 

Diese Methode ist Teil einer Klasse Extractor, die den Zeitunterschied extrahiert, der für zwei Peaks erforderlich ist, um sie in eine Sonde zu paaren. Meine Frage ist:

  1. Ist die Peak-Objekt-Erstellung falsch? oder die Konvertierung in ArrayList falsch?
  2. Ist die NPE aufgrund von proples.length (in einer anderen Klasse deklariert) null?

Pl Hilfe. Ich bin neu in Java und arbeite mich nur durch einen Shazam-ähnlichen Code, der eine Audiodatei-Eingabe hat - versuche, das durch einen Mikrofoneingang in einer anderen Klasse zu ersetzen.

+1

Ich würde überprüfen, ob 'samples' ist nicht' null' in Ihrem Debugger. –

+0

Spectra.spectraInterval ist ein primitiver oder ein Wrapper? Ein Null Wrapper kann auch eine NPE werfen. PS: keine Notwendigkeit, die Array-Liste zu werfen, auch für Array) – AxelH

+2

Poste ein [MCVE]: posten Sie das absolute Minimum, um Ihr Problem zu zeigen. (Schreiben eines minimalen Fall ist eine gute Debugging-Technik. Damit Sie wahrscheinlich Ihr Problem lösen.) – c0der

Antwort

0

Versuchen untersuchen, dass einige Protokolle verwenden (vielleicht Proben null ist?):

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

Proben haben tatsächlich null zurückgegeben. Ich werde den Mikrofon-Eingangscode für die Samples überprüfen müssen. –

0

Ein NPE angehoben wird, wenn bekommt etwas auf einem Objekt aufgerufen, dessen Wert null. (Methoden, Attribute).

In Ihrem Fall gibt es zwei solche Anrufe in dieser Zeile:
samples.length und Spectra.spectraInterval.

Spectra.spectraInterval scheint einen statischen Aufruf zu sein, die eine NPE nicht erhöhen wird, auch wenn der Wert von spectraIntervalnull ist. (Weil es absolut legitim ist, Nullwerte zurückzugeben.)

Die samples Reihe andererseits kommt vom AudioClip. Überprüfen Sie, ob ein Wert vorhanden ist und behandeln Sie ihn, falls nicht.

Z. B.

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

Proben haben null zurückgegeben. Überprüfen Sie die AudioClip-Klasse wie Sie erwähnt haben. –

Verwandte Themen