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]