eneR: Buffer mithilfe eine Queue produziert NPE: VERZWEIFELUNG

Hi,
ich habe mir einen kleinen Event-Buffer geschrieben (um doppelte Events (wie created und modified) vom JNotifyListener abzufangen und verschobene Dateien zu erkennen).
Jetzt schmeißt das Drec*sding aber bei jeder verschobenen Datei oder Änderung einer Datei in einem Subverzeichnis ein NPE (siehe unten).

class Buffer extends Thread implements JNotifyListener {  
	private final Queue<FileEvent> _eventBuffer;  
  
	Buffer() {  
		_eventBuffer = new PriorityQueue<FileEvent>();  
	}  
  
	@Override  
	public synchronized void fileRenamed(int wd, String rootPath, String oldName, String newName) {  
		fuegeEin(new FileRenamedEvent(wd, rootPath, oldName, newName));  
	}  
  
	@Override  
	public synchronized void fileModified(int wd, String rootPath, String name) {  
		fuegeEin(new FileModifiedEvent(wd, rootPath, name));  
	}  
  
	@Override  
	public synchronized void fileDeleted(int wd, String rootPath, String name) {  
		fuegeEin(new FileDeletedEvent(wd, rootPath, name));  
	}  
  
	@Override  
	public synchronized void fileCreated(int wd, String rootPath, String name) {  
		fuegeEin(new FileCreatedEvent(wd, rootPath, name));  
	}  
  
	private void fuegeEin(FileEvent fe) {  
		if (fe != null) {  
			if (!_eventBuffer.add(fe)) {  
				System.err.println("!!!");  
			}  
		}  
	}  
  
	public FileEvent poll() {  
		if (_eventBuffer.isEmpty()) {  
			return null;  
		} else {  
			return _eventBuffer.poll();  
		}  
	}  
  
	public FileEvent poll(long time) {  
		FileEvent e = null;  
		long waited = 0L;  
  
		while (_eventBuffer.isEmpty() && waited < time) {  
			try {  
				sleep(1);  
			} catch (InterruptedException e1) {  
				// TODO Auto-generated catch block  
				e1.printStackTrace();  
			}  
			waited++;  
		}  
		if (!_eventBuffer.isEmpty()) {  
			e = _eventBuffer.poll(); //Errorline aka line 184  
		}  
  
		return e;  
	}  
  
	public FileEvent take() {  
		FileEvent e = null;  
  
		while (e == null) {  
			e = poll(1);  
		}  
  
		return e;  
	}  
}

Ich verzweifel langsam echt. Wenn ich das step-by-step debugge, tritt der Fehler nicht auf.

Der Fehler:
[code=error]Exception in thread "Thread-0" java.lang.NullPointerException
at java.util.PriorityQueue.siftDownComparable(PriorityQueue.java:679)
at java.util.PriorityQueue.siftDown(PriorityQueue.java:669)
at java.util.PriorityQueue.poll(PriorityQueue.java:578)
at de.aypac.proj.filestory_synchronizer.services.arbeitsordnerBeobachter.Buffer.poll(ArbeitsordnerBeobachter.java:174)
at de.aypac.proj.filestory_synchronizer.services.arbeitsordnerBeobachter.Buffer.take(ArbeitsordnerBeobachter.java:184)[/code]

  1. Ich verzweifel langsam echt. Wenn ich das step-by-step debugge, tritt der Fehler nicht auf.

    ui... ein Heisenbug...

    1. Ich verzweifel langsam echt. Wenn ich das step-by-step debugge, tritt der Fehler nicht auf.

      ui... ein Heisenbug...

      Naja, ich kann ihn ja ganz genau rekonstruieren (Verschieben einer Datei).
      Aber so richtig helfen tut das nicht...

  2. Hi,

    ich habe mir einen kleinen Event-Buffer geschrieben (um doppelte Events (wie created und modified) vom JNotifyListener abzufangen und verschobene Dateien zu erkennen).
    Jetzt schmeißt das Drec*sding aber bei jeder verschobenen Datei oder Änderung einer Datei in einem Subverzeichnis ein NPE (siehe unten).

    class Buffer extends Thread implements JNotifyListener {

    e = _eventBuffer.poll(); //Errorline aka line 184
    }

      
    Bei nur ca. 70 Zeilen - wie kann das Zeile 184 sein?  
      
    
    > 	at de.aypac.proj.filestory\_synchronizer.services.arbeitsordnerBeobachter.Buffer.poll(ArbeitsordnerBeobachter.java:174)  
    > 	at de.aypac.proj.filestory\_synchronizer.services.arbeitsordnerBeobachter.Buffer.take(ArbeitsordnerBeobachter.java:184)[/code]  
      
    Demnach ist Zeile 184 eine Zeile in der Methode take. Die Zeile, die Du als Zeile 184 (von weniger als 70) markiert hast, ist aber nicht in der Methode take.  
      
    Der Stacktrace ist von irgendeiner anderen Klasse (oder anderen Version der Klasse, die wir hier nicht kennen.  
    ==> keinerlei Aussage zur Ursache möglich.  
      
    cu,  
    Andreas
    
    -- 
    [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
    [O o ostern ...](http://ostereier.andreas-waechter.de/)  
      
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.  
    
    
    1. Hihö,

      class Buffer extends Thread implements JNotifyListener {

      e = _eventBuffer.poll(); //Errorline aka line 184

      Korrektur "aka line 174".  
      
      >   
      > Bei nur ca. 70 Zeilen - wie kann das Zeile 184 sein?  
      
      Es ist eine "nested" class. Da aber keine andere Klasse direkten Einfluss (nur durch die angegebenen Methoden) hat, habe ich mir den Rest gespart.  
      Daher fängt der Code bei ca. Zeile 110 an...  
        
      
      > > 	at de.aypac.proj.filestory\_synchronizer.services.arbeitsordnerBeobachter.Buffer.poll(ArbeitsordnerBeobachter.java:174)  
      > > 	at de.aypac.proj.filestory\_synchronizer.services.arbeitsordnerBeobachter.Buffer.take(ArbeitsordnerBeobachter.java:184)[/code]  
      >   
      > Demnach ist Zeile 184 eine Zeile in der Methode take. Die Zeile, die Du als Zeile 184 (von weniger als 70) markiert hast, ist aber nicht in der Methode take.  
      > Der Stacktrace ist von irgendeiner anderen Klasse (oder anderen Version der Klasse, die wir hier nicht kennen.  
      
      Ja, der Stacktrace ist von einer anderen Klasse, die "take()" (uA Zeile 184) aufruft, sollte aber nichts am Problem ändern.  
      
      > ==> keinerlei Aussage zur Ursache möglich.  
      
      Ich hoffe das hat sich jetzt geändert :S  
        
      
      > cu,  
      > Andreas
      
  3. Hi,
    ich hab jetzt eine Notlösung gefunden: Eine eigene Queue-Klasse. Naja, wodran es lag, konnte ich jetzt nicht feststellen, aber wenigstens funktionierts...

    Greez!