# Unerklärbare FileNotFoundException



## Moch (4. Dez 2013)

Hallo,

Wir arbeiten momentan an einem größeren Projekt, dessen Ziel letztlich die Optimierung des Verhaltens einer Entität sein soll. Wir bedienen uns hierbei einer zwei-dimensionalen Simulationsumgebung, die wir mit Hilfe eines Frameworks erstellen und einem weiteren Framework für Neuronale Netze, welche die Lernfähigkeit im Verhalten umsetzen.
Der Lerneffekt tritt hierbei durch häufige Iterationen mit abschließender Fitnessbewertung statt - der Evolutionstheorie angelehnt, werden die besten Netze (durch "Mutation") weiter entwickelt. Stark vereinfacht erklärt.

Im Rahmen dieser Arbeit ist es notwendig, dass Dateien erzeugt / geschrieben / beschrieben werden (z.B. wird immer dann eine neue Datei erzeugt, wenn ein neues neuronales Netz erzeugt wurde, das "fitter" als alle Vorgänger war; z.B. gibt es eine Ausgabedatei für Logs, eine für Debugdaten usw.)

Das Problem "lebt" jetzt von häufiger Wiederholung eine Schleife (vereinfacht dargestellt)
-> Netz wird erzeugt / mutiert 
-> Netz wird der Simulationsumgebung übergeben und führt die Simulation durch 
-> Netz wird bewertet

Dies funktioniert auch soweit normalerweise super. Wir haben bereits viele Lerneffekte feststellen können und das Problem läuft weitesgehend stabil. Jedoch tritt hin und wieder eine Exception auf, die wir uns nicht erklären können:

An einer Stelle, an der eine neue Datei erzeugt werden soll, kommt es zur FileNotFoundException. Diese scheint NICHT rekonstruierbar zu sein, da exakt gleiche Programmparameter nicht wieder in die Exception führen und diese Programmstelle zuvor auch schon über 1.000.000 Mal erfolgreich durchlaufen wurde (und ja, ich meine diese Zahl - die ist nicht nur daher gesagt)

Jetzt stehen wir hier und können keinen eindeutigen Implementierungsfehler unsererseits feststellen. Der StackTrace gibt uns leider auch keinen Hinweis.



> Caused by: java.io.FileNotFoundException: Ausgabe\Ordnername\Ausgabe.dat (Der Vorgang ist bei einer Datei mit einem geöffneten Bereich, der einem Benutzer zugeordnet ist, nicht anwendbar)


Das ist der - so vermute ich - entscheidende Teil (restliche Ausgabe ist der übliche StackTrace, der hier nicht weiterhilft)

Kann uns hier Jemand weiterhelfen? Wir finden den Fehler dahinter einfach nicht bzw. verstehen das Problem nicht.

Wieso wird diese Operation über 1.000.000 Mal ausgeführt und wirft dann plötzlich doch eine Exception?
Es scheint unabhängig davon zu sein, ob wir gerade etwas am System tun oder ob's einfach Nachts vor sich hin rechnet.
Der Effekt tritt weiterhin auf verschiedenen Systemen auf (zwei Windows-7-Systeme und ein Linux-System (Ubuntu)).

Jemand 'ne Idee?


----------



## diggaa1984 (4. Dez 2013)

Ihr erzeugt 1Mio mal eine neue Datei names Ausgabe.txt?

oder wird die erst nach Durchführung der 1Mio Schritte erstellt?
wie sieht der code dazu aus?
Man kann ja noch prüfen ob die Datei exitent ist, readbale, writeable und dergleichen.
Vielleicht könnt ihr da noch weitere Tests und Ausgaben drumrumbauen um den Fehlerfall einzuschränken. Schliesst ihr die Streams nach erfolgreichem Schreiben?


----------



## Moch (4. Dez 2013)

Hallo,

Den Code kann ich leider momentan nicht hier reinstellen (Erlaubnis fehlt uns) - fast alles kommt ohnehin aus einem der beiden Frameworks. Wir rufen diese spezielle Methode eigentlich nur auf. Ich habe mir den Code mal angeschaut und der sieht aus, wie jeder FileWriter, den ich bisher selbst geschrieben habe. Alle Elemente sind enthalten. Auch der Stream wird beendet

Die betreffende Datei wird tatsächlich jedes Mal überschrieben. Sie dient als Zwischenspeicher und Backup, um - z.B. im Falle eines Absturzes - den jeweils aktuellen Stand wieder zu laden.
In den meisten Fällen wird diese Datei eben auch korrekt überschrieben - und dann schlägt die Exception zu.

Wir haben das ganze jetzt erstmal mit der Brechstange bearbeitet, indem wir "Try-Catch" um den betreffenden Befehl gesetzt haben und den Fehler ignorieren (es wird lediglich eine Notiz im Log angelegt). Direkt danach (also beim nächsten regulären Aufruf) funktioniert das Überschreiben wieder.

Ich vermute anhand der Fehlermeldung eher, dass irgendein anderer, lustiger Systemprozess dazwischenfunkt. Dass der sich vielleicht in genau dem Moment die Datei anschauen möchte und somit das Überschreiben blockiert.
Es betrifft jeweils immer nur die Datei, die auch Überschrieben wird. Sämtliche Dateien, die neu geschrieben werden (fitte Netze, LogFiles) verursachen diese Exception nicht.

Kann es sein, dass irgendein Betriebssystemmodul die Dateioperation auf diese Weise ungewollt blockiert?


----------

