Ablaufunterschiede

gbunge

Aktives Mitglied
Hallo Javafans,
ich habe ein Problem welches ich nicht einmal verstehe.

In einem Codestück lese ich die Files eines Ordners.
Wenn ein bestimmtes Datenfile vorhanden ist, dann wird
dieses Datenfile bearbeitet, sonst wird nach einer
Meldungsausgabe nichts weiter gemacht.
Das Programm habe ich mit NetBeans 11 entwickelt.

Verschiedene Startvorgänge:
1. Gestartet aus der Entwicklungsumgebung, funtioniert es.
2. Mit Doppelklick im Finder gestartet, funktioniert es.
3. Gestartet aus dem Terminal, funktioniert es.
4. Als Alias auf den Bildschirm gestartet, funktioniert es nicht!

[CODE lang="java" title="Das Codestück"] private boolean readDownloads() {
boolean flag = false;

konto.money.stringWarn("Download "+downPath",0);

// alle Files in Liste schreiben
File ff = new File( downPath );
File[] list = ff.listFiles();

// Kontrolle der Liste
konto.money.stringWarn(" Fileliste: " + list );

// Downloadfile in Liste suchen
for( File s : list) {
konto.money.stringWarn(" ----- "+s.getName(),0);
if( s.getName().contains( downFile )) {
flag = true;
downPath = s.getAbsolutePath();
break;
}
}
// Abbruch, wenn kein Download vorhanden
if( !flag ) {
konto.money.stringWarn("keine Downloads vorhanden!",0);
return false;
}
// Datenfile weiter bearbeiten
workOnData( downPath );
}
[/CODE]


Was nicht funktioniert:
Im Falle von "Start4" ist die Fileliste "null" und das
Programm hängt in einer Endlosschleife.

Kann mir jemand helfen?

Gruss GBunge
 
K

kneitzel

Gast
Was meinst Du genau mit "Alias auf den Bildschirm"? Du hast da ein Shortcut angelegt? Hast Du im Shortcut ein Arbeitsverzeichnis angegeben ("Start in:" bei Windows)? Was für ein Betriebssystem nutzt Du überhaupt?
 
K

kneitzel

Gast
Ah ja, das hatte ich überlesen. Also wird mit "Alias auf den Bildschirm" wohl gemeint sein, dass er einen Link auf den Desktop/Schreibtisch gezogen hat. Diese Links verweisen zwar auf das Original aber anders als bei den Shortcuts in Windows kann man da nichts als Arbeitsverzeichnis vorgeben (So sah es jetzt zumindest bei einen ersten Tests auf Big Sur aus).

Daher wäre mein Vorschlag, das nicht über so einen Link auf eine jar Datei zu starten (Das ist wohl das, was er gemacht hat) sondern ein Startscript zu nutzen. Dieses kann dann z.B. auch das Arbeitsverzeichnis setzen und so.

Oder man baut die Applikation so, dass das Arbeitsverzeichnis keine Rolle spielt, also z.B. indem kein relativer Pfad zu der jar Datei verwendet wird.

Wenn eine Applikation weiter gegeben werden soll, dann bin ich auch ein Fan von jlink. Dann wird ein Image (Ein Verzeichnis mit allen notwendigen Dateien) erstellt incl. entsprechenden Startscripts....

Also kurz zur Erläuterung: Ich vermute, dass der Pfad in downpath relativ zur jar Datei angegeben ist. Bei dem Start über den Link auf dem Desktop ist das sogenannte Arbeitsverzeichnis jetzt aber nicht das Verzeichnis der jar Datei. Daher findet er den Pfad nicht und weil der Pfad nicht existiert, gibt listFiles() null zurück (Siehe dazu auch die Beschreibung unter https://docs.oracle.com/javase/9/docs/api/java/io/File.html#listFiles--)
 

gbunge

Aktives Mitglied
Hallo kneitzel,
ich arbeite auf einem MacBook Pro
.....
Also kurz zur Erläuterung: Ich vermute, dass der Pfad in downpath relativ zur jar Datei angegeben ist. Bei dem Start über den Link auf dem Desktop ist das sogenannte Arbeitsverzeichnis jetzt aber nicht das Verzeichnis der jar Datei. Daher findet er den Pfad nicht und weil der Pfad nicht existiert, gibt listFiles() null zurück (Siehe dazu auch die Beschreibung unter https://docs.oracle.com/javase/9/docs/api/java/io/File.html#listFiles--)

Der "downPath" ist absolut mit "/Users/gb/Downloads" definiert.
Ausserdem passiert es nicht bei mehreren, von mir programmierten Programmen, die ich alle als Link auf dem Desktop
plaziert habe, und die meistens ein ähnliches Zielverzeichnis aufweisen, das immer absolut definiert ist.
Das ist ja genau das, was ich nicht verstehe.

Gruss Günter
 
K

kneitzel

Gast
Ok, dann liege ich mit meiner Vermutung daneben. Dann wäre es wichtig, da mehr Informationen zu bekommen:
Wo genau tritt die Exception auf und was für Werte haben die Variablen an der Stelle.
Wenn es die Filelist ist, die als null zurück gegeben wird, dann wäre es interessant, auf der File Instanz zu schauen, ob es existiert, ein Verzeichnis ist und so ...

Dann frage ich mich gerade, ob es an diesen speziellen Rechten liegen könnte. Aber das sollte ja immer das Java Executable sein, dass auf den Ordner zugreifen möchte. Daher würde das die unterschiedlichen Verhaltensweisen nicht erklären. (Da meine ich https://macperformanceguide.com/blog/2020/20200119_1427-macOS-Catalina-add-java-fullDiskAccess.html um einen Link bezüglich der Rechte Thematik zu bringen)

OS X ist nicht mehr mein Hauptsystem, daher habe ich da keine tiefen Erfahrungen. Habe zwar noch ein MBA 11“ im Einsatz aber das nutze ich nur als Kommunikationsplattform wenn ich unterwegs bin ...)
 

gbunge

Aktives Mitglied
Ok, dann liege ich mit meiner Vermutung daneben. Dann wäre es wichtig, da mehr Informationen zu bekommen:
Wo genau tritt die Exception auf und was für Werte haben die Variablen an der Stelle.
Es wird keine Exception geworfen. By the Way, wenn es eine gäbe, wo würde die den dargestellt?
Ausserdem habe ich festgestellt, das Programm ist in keiner Endlosschleife, alles andere funktioniert
wie es soll, nur das Download-Einlesen eben nicht.
 

mrBrown

Super-Moderator
Mitarbeiter
Es wird keine Exception geworfen. By the Way, wenn es eine gäbe, wo würde die den dargestellt?
Wenn list null ist, wird in jedem Fall eine Exception geworfen – das Iterieren über das Array wirft dann eine NullPointerException.

Je nachdem wie du die Exception behandelst, sollte die dort zu sehen sein, wo auch deine Log-Ausgaben zu sehen sind. Im Zweifelsfall einen try-catch Block außen rum und alles loggen.



(Und das klingt jetzt böser als es gemeint ist: aber bei der "Qualität" sie man in dem Ausschnitt sieht, würde es mich nicht wundern, wenn der Fehler irgendwo anders liegt und die eigentliche Überraschung die ist, dass es in der IDE läuft. Allein schon das downpath eine Instanzvariable ist, die zu Anfang den Pfad enthält, nach der Methode aber dann auf irgendetwas völlig anderes zeigt, ist potentiell schon die Fehlerquelle...)
 

Neue Themen


Oben