Interpreter-Fehler Kann mir das mal einer erklären?

Steven Hachel

Bekanntes Mitglied
Kleiner Test über die JShell:
JDK 11 (Eclipse Temurin™)

Java:
import java.util.Map;

    System.out.printf("%s%s%n", "test_property..............................".substring(0, 30), "true");
    System.out.printf("%s%s%n", "test_property_two..............................".substring(0, 30), "true");
    System.out.printf("%s%s%n", "test_property_one_and_two..............................".substring(0, 30), "true");

    Map values = Map.of("test_property", "true", "test_property_two", "true", "test_property_one_and_two", "true");
    values.forEach((o, o2) -> System.out.printf("%s%s%n", o + "..............................".substring(0, 30), o2));

Mag mir mal einer erklären, warum die Ausgabe innerhalb der Schleife nicht wie erwartet aussieht? Was passiert da
mit der String.substring() Methode?

Meine Ausgabe:
wie erwartet:
Java:
System.out.printf("%s%s%n", "test_property..............................".substring(0, 30), "true") = java.io.PrintStream@1753acfe
test_property.................true

System.out.printf("%s%s%n", "test_property_two..............................".substring(0, 30), "true") = java.io.PrintStream@1753acfe
test_property_two.............true

System.out.printf("%s%s%n", "test_property_one_and_two..............................".substring(0, 30), "true") = java.io.PrintStream@1753acfe
test_property_one_and_two.....true

innerhalb der Schleife sieht es komisch aus:
Java:
values.forEach((o, o2) -> System.out.printf("%s%s%n", o + "..............................".substring(0, 30), o2));
test_property_one_and_two..............................true
test_property_two..............................true
test_property..............................true

Viele Grüße
Steven
 
Zuletzt bearbeitet:
o + "..............................".substring(0, 30)

Der substring Aufruf bezieht sich nur auf das String Literal.

Was Du willst, ist vermutlich etwas wie:
(o + "..............................").substring(0, 30)

Dann bezieht sich der substring Aufruf auf den neuen String, der durch das aneinander fügen der zwei Strings entstanden ist.
 
Java:
(o + "..............................").substring(0, 30)
auch das funktioniert nicht, hätte ich dazu schreiben sollen.

Viele Grüße
Steven
 
Dann schreib einmal genau, was Du versuchst.

Denn der Code:
Java:
        Map values = Map.of("test_property", "true", "test_property_two", "true", "test_property_one_and_two", "true");
        values.forEach((o, o2) -> System.out.printf("%s%s%n", (o + "..............................").substring(0, 30), o2));

gibt aus:
Code:
test_property_one_and_two.....true
test_property_two.............true
test_property.................true
 
Das ist ja witzig.
Bei mir gibt der Code über einen Functionalen bzw. Schleifen Aufruf das hier aus...
Java:
test_property_one_and_two..............................true
test_property_two..............................true
test_property..............................true

Er sollte aber das hier, wie bei dir, ausgeben:
Code:
test_property_one_and_two.....true
test_property_two.............true
test_property.................true

Welches JDK nutzt du? Evtl. hängt es damit zusammen?
 
Nebenbei: das substring ist eigentlich überflüssig, wenn Du mit String.format bzw. printf arbeitest. Ich klau mal den Code von @KonradN :
Java:
var values = Map.of("test_property", "true", "test_property_two", "true", "test_property_one_and_two", "true");
values.forEach((o, o2) -> System.out.printf("%.30s%s%n", o + "..............................", o2));
Das aber nur als kleiner, zusätzlicher Hinweis.
 
Welches JDK nutzt du? Evtl. hängt es damit zusammen?
Zeige bitte den genauen Code. Da ist keine Abhängigkeit zu einem JDK. Das wird bei allen JDKs funktionieren (bzw. komplett nicht übersetzen, wenn das JDK zu alt wäre bezüglich z.B. der Lambda Expression).

Evtl. auch einmal sicherstellen, dass wirklich der Code, den Du angepasst hast, ausgeführt wird. Nicht, dass es ein Handling Problem gibt und Du eine Datei editierst aber etwas anderes ausführst.
 
Ja, dieser Code wird so, wie ich es hier angegeben habe, ausgeführt.

Java:
import java.util.Map;

    System.out.printf("%s%s%n", "test_property..............................".substring(0, 30), "true");
    System.out.printf("%s%s%n", "test_property_two..............................".substring(0, 30), "true");
    System.out.printf("%s%s%n", "test_property_one_and_two..............................".substring(0, 30), "true");

    Map values = Map.of("test_property", "true", "test_property_two", "true", "test_property_one_and_two", "true");
    values.forEach((o, o2) -> System.out.printf("%s%s%n", (o + "..............................".substring(0, 30)), o2));

In der JShell sowie Unit Test habe ich die selbe komische Ausgabe. Nutze das OpenJDK 11. Habe ich oben auch angegeben.

Wenn mir niemand eine Erklärung geben kann, so wie ich sie mir nicht geben kann, muss ich weiter recherchieren. Muss doch einen Grund geben, warum sich das bei mir so verhält.

Hätte den ersten Beitrag zecks der Klammer gerne angepasst, aber das geht nach der ersten Antworten ja leider nicht mehr. Habe, wie bereits erwähnt, dass selbe Verhalten mit und ohne Klammer.
 
Nebenbei: das substring ist eigentlich überflüssig, wenn Du mit String.format bzw. printf arbeitest. Ich klau mal den Code von @KonradN :
Java:
var values = Map.of("test_property", "true", "test_property_two", "true", "test_property_one_and_two", "true");
values.forEach((o, o2) -> System.out.printf("%.30s%s%n", o + "..............................", o2));
Das aber nur als kleiner, zusätzlicher Hinweis.
Ich habe hier nur printf genutzt, da ich in der JShell kein log4j2 nutzen kann...
 
Du musst die Klammer schon richtig setzen. Nicht ("a"+"b".substring(0,30)), sondern ("a" + "b").substring(0,30)

Also nicht
Java:
 values.forEach((o, o2) -> System.out.printf("%s%s%n", (o + "..............................".substring(0, 30)), o2));
sondern
Java:
 values.forEach((o, o2) -> System.out.printf("%s%s%n", (o + "..............................").substring(0, 30), o2));
 
Du musst die Klammer schon richtig setzen. Nicht ("a"+"b".substring(0,30)), sondern ("a" + "b").substring(0,30)

Also nicht
Java:
 values.forEach((o, o2) -> System.out.printf("%s%s%n", (o + "..............................".substring(0, 30)), o2));
sondern
Java:
 values.forEach((o, o2) -> System.out.printf("%s%s%n", (o + "..............................").substring(0, 30), o2));
Ja Scheiße, ihr habt Recht. Das habe ich echt nicht gesehen. Krass, sowas dämliches. Danke sehr. hehehe
Sowas ist mir auch noch nicht passiert.
 

Zurück
Oben