Warum funktioniert switch aber nicht if/else?

anghenfil

Mitglied
Hallo,
ich habe eine Frage bezüglich der folgenden Quelltexte. Wieso funktioniert das gewünschte per switch, nicht aber per if/else?

Mit switch:
Java:
        String decision;
        Scanner sc = new Scanner(System.in);
      
        TD.input_question("Editor oder Spiel starten?");
        decision = sc.next();
        decision = decision.toLowerCase(); //Making input lower case
        sc.close();
        switch(decision){
        case "editor":
            Editor.editor();
            break;
        case "spiel":
            createnew = UserManager.checkUserData(); //Check if User file already exists
            if(createnew){ //If new user needed
                UserManager.userCreation(); //Start User Creation
                UserManager.loadUser(); //Load  User data (from User Creation) and start game
            }else if(createnew == false){
                UserManager.loadUser(); //Load User data and starts game
            }
            break;
        default:
            main(args);
        }

Mit if/else:
Java:
        String decision;
        Scanner sc = new Scanner(System.in);
      
        TD.input_question("Editor oder Spiel starten?");
        decision = sc.next();
        decision = decision.toLowerCase(); //Making input lower case
        if(decision == "editor"){
            Editor.editor();
        }else if(decision == "spiel"){
            createnew = UserManager.checkUserData(); //Check if User file already exists
            if(createnew){ //If new user needed
                UserManager.userCreation(); //Start User Creation
                UserManager.loadUser(); //Load  User data (from User Creation) and start game
            }else if(createnew == false){
                UserManager.loadUser(); //Load User data and starts game
            }
        }else{
            System.out.println(decision);
            main(args);
        }

Wenn ich das ganze mit if/else mache, erkennt er die Eingabe nicht und springt zu else.

Vielen Dank im Vorraus,
Grüße anghenfil
 
Zuletzt bearbeitet von einem Moderator:

Robat

Top Contributor
Jupp wie Thalius schon sagte:

Strings vergleicht man in Java mit

Java:
if(s.equals("..")) System.out.println("...");
 

Jardcore

Top Contributor
String ist ein Referenzdatentyp.
Wenn du ein == verwendest vergleichst du die Speicheradresse der beiden Objekte, nicht aber deren Inhalt.
Java:
    String a = "a";
    String b = "b";

    if(a == b) {
        // wird nicht ausgeführt.
    }

    if(a.equals(b)) {
        // heurika, wird ausgeführt.
    }

Wenn du eine Variable deklarierst reservierst du dafür Speicher. In diesem Beispiel wird mit "String a" gesagt das du Speicher benötigst. Die Variable "a" zeigt jetzt auf eine Adresse im Speicher. An der Adresse wird dein eigentlicher Wert abgelegt. Bei == wird dann nur geschaut ob die beiden Adressen gleich sind... das kann aber nicht der Fall sein. == würde nur funktionieren wenn a == a ist.
 

Harry Kane

Top Contributor

stg

Top Contributor
Statt equal muss es natürlich equals heissen. Und das man "Strings [...] mit Equal und Switch (vergleicht)" ist Quatsch.

"Strings vergleicht man mit equals, und switch weiß das."


Wieso heurika ? a und b sind ja nicht equals
Sehr weit hergeholt, aber da der Kontext nicht ersichtlich ist, wäre es zumindest möglich, dass der Inhalt von a und/oder b in der Zwischenzeit von anderer Stelle geändert wurde. ;)

Bezüglich der Frage des TEs fällt mir nur ein, dass eine Sammlung von Standard-Antworten sehr nützlich wäre. Statt auf "Antwort erstellen" wählt man einfach eine Antwort aus der Liste aus. Spart jedem Zeit und Nerven
 
X

Xyz1

Gast
Machen wir doch einen kleinen Test?:
Java:
class Test {
    static String a = "a", b = "b", c = "c";
    static String d1 = new String(new char[]{'h', 'a', 'l', 'l', 'o'});
    public static void main(String[] args) throws InterruptedException {
        String d2 = new String(new char[]{'h', 'a', 'l', 'l', 'o'});
        int[] array = new int[3];
        for (int j = 0; j < 10; j++) {
            String d3 = new String(new char[]{'h', 'a', 'l', 'l', 'o'});
            ExecutorService es = Executors.newFixedThreadPool(3);
            es.submit(() -> {
                String d4 = new String(new char[]{'h', 'a', 'l', 'l', 'o'});
                Random r = new Random();
                switch (r.nextInt(4)) {
                    case 0:
                        a = d1;
                        break;
                    case 1:
                        a = d2;
                        break;
                    case 2:
                        a = d3;
                        break;
                    case 3:
                        a = d4;
                        break;
                    default:
                        throw new AssertionError();
                }
            });
            es.submit(() -> {
                String d4 = new String(new char[]{'h', 'a', 'l', 'l', 'o'});
                Random r = new Random();
                switch (r.nextInt(4)) {
                    case 0:
                        b = d1;
                        break;
                    case 1:
                        b = d2;
                        break;
                    case 2:
                        b = d3;
                        break;
                    case 3:
                        b = d4;
                        break;
                    default:
                        throw new AssertionError();
                }
            });
            es.submit(() -> {
                String d4 = new String(new char[]{'h', 'a', 'l', 'l', 'o'});
                Random r = new Random();
                switch (r.nextInt(4)) {
                    case 0:
                        c = d1;
                        break;
                    case 1:
                        c = d2;
                        break;
                    case 2:
                        c = d3;
                        break;
                    case 3:
                        c = d4;
                        break;
                    default:
                        throw new AssertionError();
                }
            });
            es.shutdown();
            es.awaitTermination(5, TimeUnit.SECONDS);
            if (a == b) {
                array[0]++;
            }
            if (a == c) {
                array[1]++;
            }
            if (b == c) {
                array[2]++;
            }
        }
        System.out.println("a==b " + array[0] + " Mal a==c " + array[1] + " Mal b==c " + array[2] + " Mal von " + 10);
    }
}


Code:
a==b 2 Mal a==c 3 Mal b==c 4 Mal von 10
Was ich damit andeuten möchte, "der String pool 'kann nicht' immer greifen".
 

tommysenf

Top Contributor
X

Xyz1

Gast
a) Strings vergleicht man nicht mit ==, das war die Antwort auf den Fehler,
b) dass eine Diskussion entstanden ist, ist mehr so on top,
c) Pommes schmecken auch nicht ohne Majo :D

Ich hab mittlerweile festgestellt, dass bei mehreren Threads (innerhalb einer Schleife) ein lokaler String der Form String s = new String(new char[]{'h', 'i'}); nicht in den String pool wandert. Demzufolge ist ein gemeinsamer String pool mehrerer Threads (in dem Fall) wohl zu aufwändig. Bei nur einem (nicht wiederverwendeten) Thread funktioniert's. Da hat sich viel geg. früher in der Realisierung der VM geändert.
Aaaber, ihr habt's vielleicht schon bemerkt: ICH bewege mich da im Vagen / Unwissenheit. :D
Also wenn es jemand anders erklären kann, nur zu. Ich lern gerne was dazu. :D
Leider muss ich feststellen, dass mein Beispiel auch nicht "minimal" ist.
 
Zuletzt bearbeitet von einem Moderator:

Flown

Administrator
Mitarbeiter
@DerWissende HIER ist die Erklärung warum deine Strings nicht "interned" werden, denn du baust die String zur Laufzeit mit String::new. StringPool hat nichts mit Threads zu tun sondern mit Packages und Classes.

Grundsätzlich werden nur String Literale in den Threadpool gelegt und können manuell mit String#intern interened werden. Dann klappts auch mit dem Vergleichsoperator, aber der StringPool wird zu 99,9% der Fälle nicht vom Garbage Collector besucht und bläst den HeapSpace unnötig auf.
 
X

Xyz1

Gast
new String( wandert in den String pool, ich hab's ausprobiert, nur eben nicht in allen Fällen. Scheint, als hätte sich einiges geändert in letzter Zeit.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Wieso funktioniert mein Switch Case nicht ?! Java Basics - Anfänger-Themen 9
L Taschenrechner mit switch und while funktioniert noch nicht richtig Java Basics - Anfänger-Themen 22
C Switch / Case Problem, break funktioniert nicht! Java Basics - Anfänger-Themen 3
J Datenüberwachung funktioniert nicht Java Basics - Anfänger-Themen 9
mo13 JTextField funktioniert nicht Java Basics - Anfänger-Themen 4
J .jar datei öffnen funktioniert nicht Java Basics - Anfänger-Themen 17
G Mit jPackage erstellte EXE funktioniert nicht Java Basics - Anfänger-Themen 2
G Robot funktioniert nicht bei SelectionListener Java Basics - Anfänger-Themen 6
R RegEx funktioniert nicht Java Basics - Anfänger-Themen 14
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
monsterherz Punkt Notation funktioniert nicht Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
ms_cikar Bin to Float convertieren funktioniert nicht Java Basics - Anfänger-Themen 24
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
Garrit1994 Continue funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
B Methoden Übergebe Variabel funktioniert nicht Java Basics - Anfänger-Themen 17
P exportiertes Programm funktioniert nur teilweise Java Basics - Anfänger-Themen 7
Agent4nobody Programmstart durch aufruf des interpreters funktioniert nicht Java Basics - Anfänger-Themen 14
Fugover Programm funktioniert nicht Java Basics - Anfänger-Themen 11
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
sserio Array funktioniert nicht Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
sserio Größtes Palindrom-Produkt Programm funktioniert nur halb Java Basics - Anfänger-Themen 23
sserio Rekursion größten Primfaktor finden funktioniert nicht Java Basics - Anfänger-Themen 8
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
Avalon Warum funktioniert eine Bedingung und eine andere nicht? Java Basics - Anfänger-Themen 2
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
U Wie genau funktioniert der ! Operator Java Basics - Anfänger-Themen 3
stormyark 4 Bit in einer for-schleife funktioniert nicht Java Basics - Anfänger-Themen 3
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
M Java printf(Locale.... funktioniert nicht Java Basics - Anfänger-Themen 3
N Wieso funktioniert die Deklaration nicht Java Basics - Anfänger-Themen 3
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
districon Backtracking funktioniert nicht ganz Java Basics - Anfänger-Themen 3
H Array rückwärts auslesen funktioniert nicht Java Basics - Anfänger-Themen 3
S Math.random funktioniert nicht Java Basics - Anfänger-Themen 5
S Schleife funktioniert nicht Java Basics - Anfänger-Themen 2
B Ausgabe in TextArea funktioniert nicht Java Basics - Anfänger-Themen 2
Henri Webservice Delete und Update Methode funktioniert nicht Java Basics - Anfänger-Themen 27
J ActionListener von JCheckBox im Knoten von JTree funktioniert nicht Java Basics - Anfänger-Themen 2
C System.out.println - Parameterübergabe funktioniert nicht Java Basics - Anfänger-Themen 2
JD_1998 Hilfsmethode if return funktioniert nicht Java Basics - Anfänger-Themen 2
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
T % funktioniert nicht Java Basics - Anfänger-Themen 2
D e(fx)clipse installieren funktioniert nicht Java Basics - Anfänger-Themen 3
D GPIO Nutzung mit Pi4J Library auf Raspberry funktioniert nicht Java Basics - Anfänger-Themen 3
F Java GUI-PaintComponent funktioniert nicht Java Basics - Anfänger-Themen 1
J equals funktioniert nicht - Warum Java Basics - Anfänger-Themen 13
L hilfe run button funktioniert nicht Java Basics - Anfänger-Themen 13
I Array funktioniert nicht. Java Basics - Anfänger-Themen 2
T if else Befehl funktioniert nicht richtig Java Basics - Anfänger-Themen 27
V_Fynn03 Erste Schritte BubbleSort Quelltext funktioniert noch nicht Java Basics - Anfänger-Themen 1
V_Fynn03 Erste Schritte JButton funktioniert nicht trotz richtiger Methode. Java Basics - Anfänger-Themen 17
R Erste Schritte Eclipse - Java - System.out.println(); funktioniert nicht Java Basics - Anfänger-Themen 2
G Programm mit Schleife funktioniert nicht Java Basics - Anfänger-Themen 5
T Redirect funktioniert nicht Java Basics - Anfänger-Themen 3
R Mein Plugin funktioniert nicht? Java Basics - Anfänger-Themen 10
J Zufallszahl funktioniert nicht Java Basics - Anfänger-Themen 27
D Klassen add Methode funktioniert nicht. Java Basics - Anfänger-Themen 31
J ImagaIO funktioniert nicht unter Ubuntu Java Basics - Anfänger-Themen 23
F Vergleiche mit charAt funktioniert bei Strings nicht, was tun? Java Basics - Anfänger-Themen 5
N Wochentagberechner Ausgabe funktioniert nicht Java Basics - Anfänger-Themen 7
G Mein Java Projekt funktioniert nicht Java Basics - Anfänger-Themen 5
J Einlesen von Datei funktioniert nicht Java Basics - Anfänger-Themen 8
P Zeichenkette Zeichen ausschlißen funktioniert nicht richtig Java Basics - Anfänger-Themen 9
F Primzahlsuche Schleife funktioniert nicht, HILFE! Java Basics - Anfänger-Themen 8
M Methoden Arrays.deepequals() funktioniert nicht Java Basics - Anfänger-Themen 2
B Statische Methode return funktioniert nicht. Java Basics - Anfänger-Themen 19
S JDK 9 für Windows 32 bit installiert, aber es funktioniert nix Java Basics - Anfänger-Themen 6
F Input/Output die eine txt-Datei funktioniert die andere nicht Java Basics - Anfänger-Themen 8
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
D Funktion zwei Arraylisten zu verleichen ob gleich funktioniert nicht Java Basics - Anfänger-Themen 26
A Hilfe bei Rekursion,Ich verstehe nicht,wie funktioniert die Rekursion in der Methode "walk" Java Basics - Anfänger-Themen 13
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
P Upload Button funktioniert nicht Java Basics - Anfänger-Themen 13
S Dijkstra Algorithmus funktioniert nicht Java Basics - Anfänger-Themen 4
M Datei einlesen mit Scanner funktioniert nicht (FileNotFoundException) Java Basics - Anfänger-Themen 6
A TicTacToe funktioniert bis auf "schiefer" Sieg Java Basics - Anfänger-Themen 6
M Erste Schritte Importieren funktioniert nicht Java Basics - Anfänger-Themen 7
N Funktion funktioniert nicht immer Java Basics - Anfänger-Themen 6
F FileCreation - PrintWriter funktioniert nicht... Java Basics - Anfänger-Themen 1
I Collections.shuffle funktioniert nicht Java Basics - Anfänger-Themen 1
T Methode in Klasse funktioniert nicht Java Basics - Anfänger-Themen 14
T While Schleife funktioniert nicht Java Basics - Anfänger-Themen 14
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
M Frage, wie dieser Code funktioniert, bzw. weshab er bei mir nicht funktioniert Java Basics - Anfänger-Themen 4
L Level Reset funktioniert nicht Java Basics - Anfänger-Themen 3
A Java Scanner Funktioniert nicht Java Basics - Anfänger-Themen 2
R Kleines Java Spiel funktioniert nicht. Java Basics - Anfänger-Themen 2
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 12
B OOP Objekt in IF erzeugen - funktioniert nicht so richtig Java Basics - Anfänger-Themen 11
W Warum funktioniert meine if Anweisung nicht? Java Basics - Anfänger-Themen 8
J Stringvergleich funktioniert nicht Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben