Ärgerlicher „Bug“ in Javas Files-API

Mannomannomann. Da debuggt man eine Stunde für einen Fehler, der m.E. im Design der Java-Files-API liegt. Erwartungshaltung vs. implementierte Realität. Wenn ich schreibe: Files.writeString(file, content, StandardOpenOption.CREATE, StandardOpenOption.WRITE); dann erwarte ich, dass eine neue Datei angelegt wird, falls sie noch nicht existiert, dass der Inhalt "content" in die Datei geschrieben wird und diese danach nur diesen Inhalt enthält. Aus mir unerfindlichen Gründen hat sich das Java-Team aber dafür entschieden, dass der...

Java-Stream-API

Weil ich gestern das Script hatte: die Stream-API von Java ist schon geil für einige Anwendungsfälle. Kurz, prägnant und lesbar. Ausschnitt vom Code gestern: einmal Pfad bis in die Unterverzeichnisse traversieren und die Dateien bearbeiten: try (Stream<Path> paths = Files.walk(pathSource)) { paths .filter(Files::isRegularFile) .filter(path -> path.toString().endsWith(EXTENSION)) .forEach(path -> processFile(path, args[1], Integer.parseInt(args[2]))); } Gerade das Filter-Map-Reduce-Pattern macht was her (Map ist im Beispiel nicht dabei). Aber ich finde es nicht einfach...

Java als Scriptsprache

Mal etwas anderes als Filme: Seit Java 11 kann man Java als Scriptsprache einsetzen, das heißt, direkt eine Java-Datei aufrufen. Im Endeffekt schreibt man eine Klasse mit main-Methode, die die Arbeit erledigt (man kann wohl mehrere Klassen in eine Datei packen, aber wer macht sowas). Was rauskommt, ist typisches Scripting der ersten Stunde: Spaghetticode, der eine Aufgabe erledigt und nicht wiederverwendet werden kann. Wenn man sich dessen bewusst ist, ist...

xjc: fehlender Modul-Export

xjc 2.3.2 liefert mir eine Exception wegen eines fehlenden Modul-Exports von com.sun.tools.xjc zu com.sun.xml.bind. Der Fehler ist im Git gefixt, seitdem gab es noch kein neues Release, also hab ich xjc selbst kompiliert. Vorgehen siehe https://ekkart.de/computer/programmierung/java/jaxb/ Vielleicht nützt das ja jemandem bis zum nächsten Release.

Java import-Fehler von QName

Die Umstellung von Java 8 auf Java 9+ ist ja sowieso schon mühselig, wenn man aber ganz exotische Fehler bekommt... Bei mir ging folgender Import nicht: import javax.xml.namespace.QName; Erstaunlicherweise ist QName eine Java-Standardklasse, sie wurde per Autocomplete auch gefunden, dann aber als not found gekennzeichnet. Der Fehler war, dass im Classpath die Maven-Abhängigkeiten vor der JRE-Library standen. Wenn man das ändert (in eclipse bei Java Build Path und Order/Export vertauschen, auch...

eclipse-Problem, maven funzt

Weiteres Problem gelöst: meine Quellen kompilierten mit maven aus eclipse heraus (run as -> maven install) in eclipse selbst gab es jedoch Fehler wegen nicht geladener Abhängigkeiten. Geholfen hat: maven -> Update Project
Ekkart Kleinod Computer

eclipse-Probleme beim Kompilieren von Tests

Ich hatte das Problem, das nach einem Update von eclipse meine Testklassen nicht mehr kompilierten, da die JUnit-5-Testklassen (per maven eingebunden)  nicht gefunden wurden. Ich vermutete erst JUnit als Übeltäter, eine Kompilierung über maven funktionierte jedoch. Stack Overflow ist mein Freund: in eclipse wurde ein neues Attribut eingeführt, das die Testklassen identifiziert, vorher ging das automatisch, wenn man sie in ein Verzeichnis "test" gelegt hat. Da die Klassen nun nicht...
Ekkart Kleinod Computer

Java 10 und JavaFX, Oracle Java und OpenJDK

Es ist manchmal ein Kreuz mit Java. Zunächst muss man sich unter Linux (wahrscheinlich auch unter Windows, wer weiß), entscheiden, ob man mit Oracle Java oder OpenJDK entwickelt. Das ist solange kein Unterschied, bis man JavaFX einsetzen will, das XML-basierte GUI-Elemente zur Verfügung stellt. JavaFX ist bei Oracle bei Java 8 und 9 dabei, bei OpenJDK muss man das extra installieren oder sich sein OpenJDK selbst compilieren. Ich will ja...

Java: Instanzen von Generics

Ab und an habe ich das Problem, bei Klassen mit Generics eine Instanz des Generics erstellen zu wollen. Das funktioniert leider nicht direkt: T newObject = new T(); Also muss man um das Problem herumprogrammieren. Üblicherweise wird die Übergabe einer Klasse empfohlen, die für die Instanziierung genutzt wird. Die Lösung finde ich häßlich, unschön und unelegant. Java 8 bietet mit der Einführung von Lambdas und entsprechenden Hilfsklassen eine elegantere Möglichkeit,...
Ekkart Kleinod Computer