Queue: Wie kann hier ein null-Pointer Exception auftreten?!

  • Themenstarter Themenstarter eneR
  • Beginndatum Beginndatum
E

eneR

Gast
Hallo,
ich hab ein kleines Problem: Bei diesem Programm tritt regelmäßig dieser Error auf:
Console hat gesagt.:
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:153)
at de.aypac.proj.filestory_synchronizer.services.arbeitsordnerBeobachter.ArbeitsordnerBeobachter.run(ArbeitsordnerBeobachter.java:48)
und ich habe keine Idee, wie der zu stande kommt.

Hier der "produzierende" Code:
[JAVA=117]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) {
_eventBuffer.add(new FileRenamedEvent(wd, rootPath, oldName, newName));
}

@Override
public synchronized void fileModified(int wd, String rootPath, String name) {
_eventBuffer.add(new FileModifiedEvent(wd, rootPath, name));
}

@Override
public synchronized void fileDeleted(int wd, String rootPath, String name) {
_eventBuffer.add(new FileDeletedEvent(wd, rootPath, name));
}

@Override
public synchronized void fileCreated(int wd, String rootPath, String name) {
_eventBuffer.add(new FileCreatedEvent(wd, rootPath, name));
}

public FileEvent poll() {
return _eventBuffer.poll();
}

public FileEvent poll(long time) {
FileEvent e = null;
long waited = 0L;

while (e == null && waited < time) {
e = _eventBuffer.poll();
try {
sleep(1);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
waited++;
}

return e;
}

public FileEvent take() {
FileEvent e = null;

while (e == null) {
e = _eventBuffer.poll();
try {
sleep(1);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

return e;
}[/code]

Wäre super, wenn jemand eine tolle Idee dazu hätte 🙂

P.S. Der Fehler tritt nur auf, wenn ich in einem Sub-Verzeichnis des "JNotifyListener"-belegten Verzeichnisses eine Änderung vornehme...
 
Was steht rund um Zeile
Code:
ArbeitsordnerBeobachter.java:153
?
 
Die Zeilen in dem Codeausschnitt sind "echt", daher steht in der Zeile
Code:
e = _eventBuffer.poll();
.
 
du musst ein null element in deiner Queue haben, da in die NPE ja in der PriorityQueue geschieht, wo das interne Element genutzt wird. wenn das null ist -NPE
 
du musst ein null element in deiner Queue haben, da in die NPE ja in der PriorityQueue geschieht, wo das interne Element genutzt wird. wenn das null ist -NPE

Aber wie kommt das da rein? Alle Methoden, die die Klasse hat, sind hier auch im Code. Keine davon produziert
Code:
_eventBuffer.add(null);
oder übersehe ich da was?
 
Auch dieser Code bringt kein "!!!" raus, nur die NPE in (dann) Zeile 168:

[JAVA=165]if (_eventBuffer.contains(null)) {
System.err.println("!!!");
}
e = _eventBuffer.poll();[/code]
 
Erm leerst du in dieser Schleife nicht deine Queue aus? Für jede Millisekunde die du wartest entfernst du ein weiteres Element.
 
Nope.
Retrieves and removes the head of this queue, or returns null if this queue is empty.
Darum ja auch die
Java:
while (e==null) {
e = _eventBuffer.poll();
}
Schleife. Damit "poll"t er so lange, bis irgendwie ein FileEvent in der Queue liegt.
 
Java:
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();
		}

		return e;
	}

	public FileEvent take() {
		FileEvent e = null;

		while (e == null) {
			e = poll(1);
		}

		return e;
	}
}
Funktioniert auch nicht. Gleicher Fehler.
Ich verzweifel langsam echt. Wenn ich das step-by-step debugge, tritt der Fehler nicht auf.
 
Warum benutzt du keine BlockingQueue? Das was du ausprogrammierst gibts doch schon alles und nochdazu effizienter gelöst.
 

Neue Themen


Zurück
Oben