# String von einer Variable als Variable nutzen



## H3llGhost (20. September 2007)

Hallo Leute,

ich habe mal eine Frage:
Ich habe eine Funktion geschrieben:


```
public static void trycatch(String text, String Varart, String Variable)
  {
      int excep = 1;
      InputStreamReader isr = new InputStreamReader(System.in);
      BufferedReader eingabe = new BufferedReader(isr);
      
      while (excep == 1)
      {
      excep = 0;
      System.out.print(text);
      try
         {
          if (Varart == "Int")
          {
          Variable = eingabe.readLine();
          }
         }
      catch (Exception e)
         {
          System.out.println("Ungültige Eingabe!\n");
          excep = 1;
         }
      }
  }
```

Und ich möchte als String die Variable übergeben in der gespeichert werden soll.
Das ist ja einfach, aber wie gebe ich das denn so aus, dass er das als Variable ansieht?


----------



## zerix (20. September 2007)

Hallo,

Ich verstehe nicht so ganz was du machen willst?

MFG

zEriX


----------



## H3llGhost (20. September 2007)

Ich rufe die Funktion mit

trycatch(String text, String Varart, String Variable)

auf!

Nun gebe ich folgendes mit:
trycatch("Bitte geben Sie die Anzahl ein!", "Int", "var_string")

Er soll die Funktion aufrufen gibt dann "Bitte geben Sie die Anzahl ein!" aus.
die Varart am besten erstmal aussenvor lassen.
Er soll dann die Eingabe in var_string speichern.
Dazu muss ja der übergebene String als Variablenname akzeptiert werden, aber wie?


----------



## zerix (20. September 2007)

Ich schätze mal, dass du das machen willst, weil zahlen in einer Integer-Variable gespeichert werden sollen und Strings in einer String Variable, oder?

Die Variablen die du als String angibst, die gibts schon in deiner Klasse, oder?

Falls dies so sein sollte, kannst du das mit Reflection lösen.

MFG

zEriX


----------



## Xondio (20. September 2007)

Hallo ,

h3llGhost hat glaube ich das gleiche Problem wie ich ....

werde versuchen das in anderen worten mal zu beschreiben ....

1. Man liest ein String von irgendwo ein ... (z.b. 
	
	
	



```
String teststring = "testinhalt"
```


2. nun soll der inhalt dieses strings als variablen name verwendet werden
(z.b. 
	
	
	



```
int XXXXXXX = 29; // XXXXXXX steht für den inhalt des teststrings
```
 ... hier würde dann  eine int variable mit dem namen testinhalt erzeugt werden.)

so glaube ich ist die problematik ...
das ganze ist denk ich mal ganz praktisch,  wenn man dynamisch variablen oder classen instanzen erzeugen will um sie später mit dem übergabe string als namen leicht zu identifizieren bzw zugreifen kann


----------



## Xondio (20. September 2007)

ich hab endlich was in der forums suche gefunden ....
das ganze nennt sich Reflection ...
dazu gibts schon nen thread der das ganz gut erklärt

http://www.tutorials.de/forum/java/277836-string-als-methoden-oder-variablennamen-verwenden.html


----------



## zerix (20. September 2007)

Xondio hat gesagt.:
			
		

> ich hab endlich was in der forums suche gefunden ....
> das ganze nennt sich Reflection ...
> dazu gibts schon nen thread der das ganz gut erklärt



Das habe ich doch schon in meinem letzten Post gesagt.

MFG

zEriX


----------



## Xondio (20. September 2007)

stimmt ;D sorry

aber weist du auch wie das mit Reflection funktioniert ? 

bis jetzt habe ich nur die möglichkeit gefunden den Classen namen oder methoden namen zu erfragen bzw zu setzen ... also 
	
	
	



```
TestClass flx = constructor.newInstance(....
```

aber:
ich will nur den namen (hier flx) zur laufzeit frei wählen bzw von eine String Variable ersetzen ...

da muss es doch einen einfachen "platzhalter" in java für geben ...
also irgendwie sowas 


```
String flx = "bluub";
TestClass flx.toValue = new TestClass(....);
```

so das die JVM das als TestClass bluub = new TestClass(.. versteht ...


----------



## zerix (20. September 2007)

Ich verstehe aber nicht was das bringen soll. Du kannst die Variable sowieso nur in der Methode verwenden und danach ist es das alles doch direkt wieder verworfen. Das heißt, es bringt dir keinen Unterschied, wenn du die Variable schon am Anfang anlegst oder per String bestimmen könntest.

MFG

zEriX


----------



## Xondio (20. September 2007)

Angenommen ich lese mehrere Strings ein und will verschiedene JPanels mit den Strings als Name zu einem Frame adden und anschließend die JPanles verändern je nachdem was für infos ich dann einlese ... 

oder gibt es evntl in Java einer andere möglichkeit gezielt auf ein Object(JPanel) zuzugreifen ?


----------



## zerix (20. September 2007)

Wenn du die Namen einlesen willst, weißt du ja während dem Programmieren ja nicht, was einmal in der Text-Datei stehen wird. Wenn du dann den Namen einfach als String übergeben willst, musst du den String ja auch irgendwie halten und dafür brauchst du auch eine Variable die du bennen musst.
Beim einlesen könntest du zum Beispiel alle Objecte in einer ArrayList speichern, dann kannst du über den Index der Liste auf die einzelnen Objecte zugreifen. Du könntest dann beim JPanel und auch bei allen anderen Swing-Komponenten mit der Methode setName() einen Namen dem Panel geben.


Wenn du halt eine Methode oder eine Variable hast und willst über einen String diese Methode aufrufen, dann ist Reflection die richtige Variante. Per Reflection kannst du auch Objecte einer Klasse erzeugen.

MFG

zEriX


----------



## Thomas Darimont (20. September 2007)

Hallo,

das was du machen willst lässt sich ziemlich einfach über eine Map realisieren.
Key ist dabei der Variablenname und Value der entsprechende Wert.

Gruß Tom


----------



## zerix (20. September 2007)

@Tom

Stimmt daran hab ich gar nicht gedacht, dass man das so realisieren könnte.

MFG

zEriX


----------



## H3llGhost (20. September 2007)

Ich habe mir mal den Link angeschaut ...

Aber ich steige da nicht ganz durch ...
Kann jemand das mal auf mein Beispiel anwenden?


----------



## zerix (21. September 2007)

Könntest du mal kurz erklären warum du das machen willst? Die Variablen die du als String übergeben willst, gibt es die schon, oder sollen die komplett neu angelegt werden und nachher überall verwendbar sein?

MFG

zEriX


----------



## Xondio (21. September 2007)

Danke für die Tips , habe es so ähnlich wie mit einer Map gelöst ...

ich habe einfach die Conteiner Klasse überladen (JPanel) und einen eindeutigen index an jedes JPanel drangeklebt ...

so kann ich mein CJPanel einfach identefizieren und im nachhinein Componenten adden , verändern und auslesen ...

im grunde ist das ja ne selbstgebaute map 
nur mit dem Vorteil das ich nachdem die Panels benutzt wurden einfach den Wert jedes generieten Panels abfragen kann ...

Die einzigste befürchtung die ich dabei habe ist das das alles evntl etwas speicherlastig wird 

mal schaun ^^

Danke nochmal an Thomas und zEriX


----------



## H3llGhost (21. September 2007)

Xondio hat gesagt.:


> [...]
> 2. nun soll der inhalt dieses strings als variablen name verwendet werden
> (z.b.
> 
> ...



Das habe ich vor ...
Verstehst du das?


----------



## zerix (21. September 2007)

Ok, wenn du eine neue Variable anlegen willst geht das nicht mit Reflection. Dann kannst du es auch mit einer HashMap lösen.

Da gibt es einen Key und dazu kannst du irgendein Object speichern.

MFG

zEriX


----------



## H3llGhost (21. September 2007)

Äh ...
Ich verstehe nur Bahnhof ... 

Wärst du vielleicht so nett und postest ein Beispiel?


----------



## zerix (21. September 2007)

Also erstmal du kannst in Java nicht über einen String entscheiden wie eine Variable heißen soll. Du könntest allerdings ne HashMap nutzen. 


```
private HashMap variablen = new HashMap();
public static void trycatch(String text, String Varart, String Variable)
  {
      int excep = 1;
      InputStreamReader isr = new InputStreamReader(System.in);
      BufferedReader eingabe = new BufferedReader(isr);
      
      while (excep == 1)
      {
      excep = 0;
      System.out.print(text);
      try
         {
          if (Varart == "Int")
          {
          String eingabe = eingabe.readLine();
          variablen.put(Variable, eingabe);
          System.out.println(variablen.get(Variable));
          }
         }
      catch (Exception e)
         {
          System.out.println("Ungültige Eingabe!\n");
          excep = 1;
         }
      }
  }
```


Ich hoffe, dass hilft dir weiter.

MFG

zEriX


----------



## H3llGhost (21. September 2007)

Hallo,

erstmal danke für dein Beispiel!
Nun aber noch eine Frage:
Was macht folgendes genau?

```
variablen.put(Variable, eingabe);
```


----------



## zerix (24. September 2007)

Schau dir doch einfach mal die API zur HashMap an. Mit put packst du die Objecte in die HashMap. Mit dem ersten Parameter kann man auf das Object zugreifen, das man im zweiten Parameter übergibt.

Mit get kann man sich dann über den Key (erster Parameter bei put) das Object holen.

MFG

zEriX


----------



## H3llGhost (28. September 2007)

Hallo,

ich bekomme immer folgenden Fehler:

trycatch.java:26: eingabe is already defined in trycatch(java.lang.String,java.lang.String,java.lang.String)

Und der Code lautet:


```
import java.util.HashMap;
import java.io.*;

public class trycatch {

  public static void main(String[] args) {

  }
  
  
  private HashMap variablen = new HashMap();
  public static void trycatch(String text, String Varart, String Variable)
  {
      int excep = 1;
      InputStreamReader isr = new InputStreamReader(System.in);
      BufferedReader eingabe = new BufferedReader(isr);

      while (excep == 1)
      {
      excep = 0;
      System.out.print(text);
      try
         {
          if (Varart == "Int")
          {
          String eingabe = eingabe.readLine();
          variablen.put(Variable, eingabe);
          System.out.println(variablen.get(Variable));
          }
         }
      catch (Exception e)
         {
          System.out.println("Ungültige Eingabe!\n");
          excep = 1;
         }
      }
  }
  
}
```


----------



## MeinerEiner_80 (28. September 2007)

Moin!
Na der Fehler steht doch da!
Du hast zweimal ne Variable mit dem Namen "eingabe" deklariert...(nen String und einen BufferedReader)

*grüssle*
MeinerEiner


----------



## H3llGhost (28. September 2007)

Hallo

habe es nun auf:


```
String eingabe2 = eingabe.readLine();
          variablen.put(Variable, eingabe2);
          System.out.println(variablen.get(Variable));
```

geändert und es geht nun ohne Fehler, aber es erscheint was anderes:

Note: trycatch.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

Was muss ich nun machen?


----------



## MeinerEiner_80 (28. September 2007)

Ignorieren da es eh nur eine Warnung ist, ein 

```
@SuppressWarnings("unchecked")
```
vor deine Methode stellen, so wir dann die Warnung unterdrückt, oder
deine HashMap folgendermaßen erstellen:
HashMap<String,String> variablen = new HashMap<String,String>();

Siehe dazu auch beispielsweise hier:
http://www.fhwedel.de/~si/seminare/ws05/Ausarbeitung/5.generics/genjava1.htm

*grüssle*
MeinerEiner


----------



## zerix (28. September 2007)

Das sind eigentlich nur warnings. Wenn du aber mal sagst in welcher Zeile die Warnung ist, dann kann man die bestimmt beheben.

Man kann ja zuerst mal schauen, dass man es so schreibt, dass kein Warning erscheint. Wenn das nicht funktioniert, kann man diese Annotation benutzen

```
@SuppressWarnings("unchecked")
```

MFG

zEriX


----------

