# Ein String eine Zahl zuweisen



## Trabbelmaker (16. Aug 2014)

Guten Tag,
ich bin noch ein Anfänger in Java, darum seit nicht so hart zu mir .
Mein Problem:
Wenn ich in der Console "Deutsch" oder "Englisch" schreibe, möchte ich einer Variable einen bestimmten Wert zuweisen. Kurze Erklärung: Wenn ich Deutsch schreibe, soll die Variable den Wert 1 bekommen und wenn ich Englisch schreibe, soll die Variable den Wert 2 bekommen.
So sieht mein Code aus:

```
class Sprachauswahl {
	private String sprache;
	private int sprachezahl;
	
	Scanner scan = new Scanner(System.in);

	public void zahlenEingabe() {
		System.out.println(">>>>Sprache wählen<<<<");
		System.out.println("Schreib die Sprache in den Chat die du gerne haben möchtest. Zur Auswahl stehen: ");
		System.out.println("Deutsch || Englisch || Französich");
		sprache = scan.nextLine();
		
		
		if(sprache == 1) {
			Deutsch speakgerman = new Deutsch();
			speakgerman.languageGerman();
		} else if(sprache == 2) {
			English speakenglish = new English();
			speakenglish.languageEnglish();
		} else if(sprache == 3) {
			France speakfrance = new France();
			speakfrance.languageFrance();
		}
	}
}
```


----------



## OutOfBeerExept. (16. Aug 2014)

Und deine Frage? Du präsentierst lediglich deinen Code... was funktioniert denn nicht? Ohne den Code geprüft zu haben, da er korrekt aussieht, scheint der Codeschnipsel doch das geschilderte Verhalten an den Tag zu legen oder nicht?


----------



## Trabbelmaker (16. Aug 2014)

Also ich habe es überarbeitet und mir ist eingefallen, dass das mist ist was ich mache 
Ich habe den Code jetzt etwas besser gemacht, aber es funktioniert immer noch nicht.

```
class Sprachauswahl {
	private String sprache, Deutsch, Englisch, Französisch;
	
	Scanner scan = new Scanner(System.in);

	public void zahlenEingabe() {
		System.out.println(">>>>Sprache wählen<<<<");
		System.out.println("Schreib die Sprache in den Chat die du gerne haben möchtest. Zur Auswahl stehen: ");
		System.out.println("Deutsch || Englisch || Französich");
		sprache = scan.nextLine();
		
		if(sprache == Deutsch) {
			Deutsch speakgerman = new Deutsch();
			speakgerman.languageGerman();
		} else if(sprache == Englisch) {
			English speakenglish = new English();
			speakenglish.languageEnglish();
		} else if(sprache == Französisch) {
			France speakfrance = new France();
			speakfrance.languageFrance();
		}
	}
}
```

Also mein Problem ist folgendes. Der Code führt nicht die Klasse aus. 
Also wenn ich Deutsch in die Console schreibe, soll der die Klasse Deutsch ausführen

```
if(sprache == Deutsch) {
			Deutsch speakgerman = new Deutsch();
			speakgerman.languageGerman();
```
>>Klasse Deutsch:<<

```
class Deutsch {
	
	public void languageGerman() {
		System.out.println("Du hast die Sprache auf Deutsch gestellt.");
	}
}
```


----------



## Bug Fisher (16. Aug 2014)

Du erwartest einen Bezug des compilers zu deiner Logik, die leider nicht möglich ist; nämlich
sowas wie:
1 -> deutsch
2 -> english
usw...
das steht nicht mal menschennachvollziehrbar irgendwo!

Abgesehen davon postest du code, der gar nicht kompiliert ! Das wird hier und auch woanders nicht gern gesehen, wenn du nicht explizit fragst, warum sich etwas nicht übersetzen lassen will.

Dein (jetziges) Problem lässt sich via
if(sprache.equals("1")) usw.
lösen, wenngleich du nutzerunfreundlich nichtmals einen Hinweis dazu gibst, wie eine eigebegebene Ziffer interpretiert werden wird.
Ist jetzt "21" deutsch ? Oder "0" englisch; was ist mit "21.5" ? deutsch-schweiz?

Und wenn dein Block soweit funktioniert... musst du trotz if-else, immer wieder Fallunterscheidungen machen... soweit meine Prophezeihung 
Die Antwort darauf ist dann Polymorphie, aber dazu werden wir, wenn es dir ernst ist, dann noch kommen


----------



## OutOfBeerExept. (16. Aug 2014)

Soo die Lösung ist da:


```
public class Sprachauswahl {
	
        private String sprache;

	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	public void zahlenEingabe() {
		System.out.println(">>>>Sprache wählen<<<<");
		System.out.println("Schreib die Sprache in den Chat die du gerne haben möchtest. Zur Auswahl stehen: ");
		System.out.println("Deutsch || Englisch || Französich");
		try {
			sprache = br.readLine();
		} catch (IOException e) {
			System.out.println("Es ist ein Fehler aufgetreten: " + e);
		}

		if (sprache.trim().toLowerCase().equals("deutsch")) {
			Deutsch speakgerman = new Deutsch();
			speakgerman.languageGerman();
		}
	}
}
```

Wenn du fragen zum Code hast stell Sie einfach, sonst gehe ich davon aus, du hast alles verstanden.


----------



## Trabbelmaker (16. Aug 2014)

Also, ich will mich entschuldigen, wenn ich mich bisschen blöde ausgedrückt habe. (Kann meine Probleme schlecht beschreiben)
Aber ich versuche es so gut wie es geht zu erklären.
Was ich oben geschrieben habe, zählt nicht mehr, da ich den Code schon anderes geschrieben habe, weil es, wie es vorher war, dämlich von mir war 
Mein Problem ist jetzt, dass der Compiler keine Fehler sagt, aber der Code nicht funktioniert.
Also ich gebe eine Sprache ein, in diesen Fall "Deutsch".
Das Wort Deutsch wird nun auf ein String namens "sprache" gepackt.
Danach habe ich eine if- Abfrage die überprüfen soll, ob der String "sprache" mit "Deutsch" oder "Englisch" übereinstimmt. In diesen Fall stimmt er ja mit "Deutsch" überein und dann sollte er die Klasse "Deutsch" ausführen.
In der steht einfach nur:

```
class Deutsch {
	
	public void languageGerman() {
		System.out.println("Du hast die Sprache auf Deutsch gestellt.");
	}
}
```

Ich hoffe, ich habe es jetzt verständlicher ausgedrückt


----------



## Trabbelmaker (16. Aug 2014)

OutOfBeerExept. hat gesagt.:


> Soo die Lösung ist da:
> 
> 
> ```
> ...



Bei diesen Code bekomme ich eine menge von Fehlern.

```
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	BufferedReader cannot be resolved to a type
	BufferedReader cannot be resolved to a type
	InputStreamReader cannot be resolved to a type
	BufferedReader cannot be resolved to a type
	IOException cannot be resolved to a type

	at de.Javalernen1.java.Sprachauswahl.<init>(Sprachauswahl.java:7)
	at de.Javalernen1.java.Test.main(Test.java:6)
```
Das spuckt mein Edior aus (Ich benutze Eclipse)


----------



## OutOfBeerExept. (16. Aug 2014)

Du musst auch die Imports fixen, meist ist der Shortcut hierfür: "Strg+shift+o" oder du bindest die Imports manuell ein.


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
```

In Eclipse ist der Shortcut wie oben angegeben...


----------



## Trabbelmaker (16. Aug 2014)

Noch eine Frage zu den neuen Code.
Es kam gerade eine neue Sachen dazu, die ich vorher noch nie gesehen habe und möchte jetzt gerne die neuen Befehle erklärt bekommen, wenn das in Ordnung ist 
Ist der BufferedReader so etwas wie der Scanner? Bisher habe ich nur den normalen Scanner kennengelernt.
Was macht dieser Code?:

```
if (sprache.trim().toLowerCase().equals("deutsch")) {
			Deutsch speakgerman = new Deutsch();
			speakgerman.languageGerman();
		}
```
Wenn möglich, bitte so erklären, dass es ein Anfänger versteht 

Vielen, vielen dank nochmal, für die schnelle Hilfe.


----------



## OutOfBeerExept. (16. Aug 2014)

Ja der BufferedReader ist so etwas wie ein scanner... Ich muss zugeben ich kann dir den Unterschied zwischen Scanner und BufferedReader  jetzt nicht erklären aber Google kann dir da bestimmt weiterhelfen, wenn es dich interessiert.

So dein Problem war: 

```
private String sprache, Deutsch, Englisch, Französisch;
```
du hast 4 String variablen deklariert, davon abgesehen werden variablen immer klein geschrieben. 

später hast du den eingelesenen String mit einer leeren Variable verglichen ...


```
if(sprache == Deutsch) { // Deutsch hat keinen Inhalt ...
...
}
```
so nun zu der Codezeile die dich interessiert...

```
if (sprache.trim().toLowerCase().equals("deutsch")) {
//.trim() schneidet alle führenden und angehängten Leerzeichen ab
//.toLowerCase() mach aus allen Buchstaben in deiner Variable Kleinbuchstaben (macht z.B. aus dEuTsCh -> deutsch)
//.equals() hiermit werden Strings verglichen, es ist wie == nur für Strings
// "deutsch" ist dein String, den du vergleichen möchtest (z.B. String.equals(String))
}
```


----------



## Bug Fisher (16. Aug 2014)

Als Anfänger solltest du mindestens sowas haben (und handleUserInput aufrufen):


```
private static enum Language  {
		GERMAN, ENGLISH, FRANCE
	}
	
	private static void handleUserInput() {
		switch(getLanguage()) {
			//do ur stuff
		}
	}
	
	
	private static Language getLanguage() {
		System.out.println(">>>>Sprache wählen<<<<");
	    System.out.println("Schreib die Sprache in den Chat die du gerne haben möchtest. Zur Auswahl stehen: ");
	    System.out.println("Deutsch || Englisch || Französich");
	    
	    Scanner in = null;
	    
	    try {
	    	in = new Scanner(System.in);
	    	final String language = in.nextLine();
		    if (language.trim().toLowerCase().equals("deutsch")) {
		        return Language.GERMAN;
		    } else {
		    	//do ur stuff;
		    }
	    } finally {
	    	in.close();
	    }
	}
```

Später sollte das Ding dann eigentlich ungefähr so aussehen:


```
public interface UserInputHandler {
    public Configuration handleUserInput(final String[] inputs);
}
```

mit verschiedenen Implemetierungen für jede Sprache


----------



## Trabbelmaker (16. Aug 2014)

Ok danke, dass du dir die Zeit genommen mir das zu erklären.
Jetzt weiß ich schon ein Stückchen mehr über die Sprache 

Mit freundlichen grüßen,
Trabbelmaker


----------



## fischefr (19. Aug 2014)

> Ja der BufferedReader ist so etwas wie ein scanner... Ich muss zugeben ich kann dir den Unterschied zwischen Scanner und BufferedReader jetzt nicht erklären aber Google kann dir da bestimmt weiterhelfen, wenn es dich interessiert.



Falsch! BufferedReader und Scanner haben so rein gar nichts gemeinsam!

Der springende Punkt bei der Variante mit BufferedReader ist das stdin, das die Standard-Eingabe (im Normalfall die Tastatur) verkörpert. BufferedReader puffert lediglich die Eingabe zwischen und ermöglicht dir, aus diesem Puffer mit readLine bis zum nächsten Zeilenumbruch zu lesen. Ohne BufferedReader wäre das nur Zeichen für Zeichen möglich. Die ganze Zeile in sich erfüllt aber annähernd den gleichen Zweck wie die Zeile mit scanner. Da hat sich OutOfBeerExept. etwas unglücklich ausgedrückt. Wollte das nur nochmal klar stellen.


----------



## OutOfBeerExept. (19. Aug 2014)

@fischefr

Davon abgesehen, dass ich dein Verhalten ziemlich daneben finde, finde ich es gut das du beim Besserwissen immerhin 50% erklärt hast. Nun wissen wir, dank deiner Erklärung, dass der BufferedReader quasi ein simuliertes char Array ist. Leider hast du nichts vom Scanner erwähnt, jetzt musste ich doch einen Blick in die API werfen, weil mich der Unterschied interessiert hat. Vllt. möchtest du deinen Beitrag  kontrovers um den Scanner ergänzen evtl. interssiert es ja jemanden, dass Scanner und BufferedReader von java.lang.Object abgeleitet sind...


----------



## stg (19. Aug 2014)

[OT]Was ist denn daneben daran, dass man den OP darauf hinweist, dass eine hier getroffene Aussage (zum Teil) Unsinn war?  fischefr hat sich weder im Tonfall vergriffen noch sonst was.
Ein Scanner ist nun mal kein Reader und ein Reader kein Scanner ... beide sind für vollkommen verschiedene Aufgaben zuständig.
[/OT]


----------



## OutOfBeerExept. (19. Aug 2014)

Ich finde es einfach nur lächerlich und unverschämt, einen Kommentar der schon längst abgeschlossen ist mit irgendwelchen Halbwahrheiten und Besserwisserein abzuwerten. Zumal die Aussage: 





> Falsch! BufferedReader und Scanner haben so rein gar nichts gemeinsam!


 einfach nur falsch ist. Wer eine API lesen kann ist klar im Vorteil ^^. Schade das man unnötige Kommentare nicht runtervoten kann


----------

