# Strings aus Methode zurückgeben



## ghyme (14. Sep 2012)

Hallo,

ich entwickle gerade eine Android-App mit Java und habe ein grundsätzliches Problem mit Strings, die ich aus ner Funktion zurückgeben will.

Ich benutze in der folgenden Funktion einen SAX XML Parser und hole mir daraus ein paar Attribute:


```
public void parseXML() {
		 
        String parsedData = "";

        try {
 
            Log.w("AndroidParseXMLActivity", "Start");
            /** Handling XML */
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
 
            XMLContentHandler myXMLHandler = new XMLContentHandler();
            xr.setContentHandler(myXMLHandler);
   
            AssetManager assetManager = getAssets();
	        InputStream inputStream = null;
	           try {
	               inputStream = assetManager.open("calimero.xml");
	           } catch (IOException e) {
	               Log.e("tag", e.getMessage());
	           }
	        xr.parse(new InputSource(inputStream)); 

            ArrayList<Datapoint> itemsList = myXMLHandler.getItemsList();
            int datapoint_size = itemsList.size();
            String xml_names[]  = new String [datapoint_size];
            String xml_states[]  = new String [datapoint_size];
            String xml_dptIDs[] = new String [datapoint_size];
            String xml_groupadresses[]  = new String [datapoint_size];
            String xml_mainNumbers[]  = new String [datapoint_size];
            String xml_priority[]  = new String [datapoint_size];
            
            for(int i=0;i<itemsList.size();i++){
            	Datapoint item = itemsList.get(i);
                parsedData = parsedData + "----->\n";
                parsedData = parsedData + "Name: " + item.getName() + "\n";
                xml_names[i] = item.getName();
                parsedData = parsedData + "stateBased: " + item.getStateBased() + "\n";
                xml_states[i] = item.getStateBased();
                parsedData = parsedData + "mainNumber: " + item.getMainNumber() + "\n";
                xml_mainNumbers[i] = item.getMainNumber();
                parsedData = parsedData + "dptID: "+ item.getDptID() + "\n";
                xml_dptIDs[i] = item.getDptID();
                parsedData = parsedData + "Groupadress: "+ item.getGroupadress() + "\n";
                xml_groupadresses[i] = item.getGroupadress();
                parsedData = parsedData + "priority: "+ item.getPriority() + "\n";
                xml_priority[i] = item.getPriority();
            }
            //TODO die Werte auch außerhalb der Methode verfügbar machen
            Log.w("AndroidParseXMLActivity", "Done");
        }
        catch (Exception e) {
            Log.w("AndroidParseXMLActivity",e );
        }    
    }
```

Wie bekomme ich die einzelnen Strings der Items also z.B. xml_names[0] als Rückgabewert aus der Funktion raus? Ist das überhaupt der richtige Weg? Habe auch schon versucht, die z.B. 
	
	
	
	





```
static String xml_names[];
```
 als globale Variable zu definieren, erhalte dann aber eine Null Pointer Exception...
Kann die Funktion auch nicht als "private static" definieren, weil die getassets()-Funktion eine nicht statische Methode ist.

Weiß jemand Rat und kann mir vllt sogar ein kleines Code Snippet posten?

Danke!


----------



## Andy17 (14. Sep 2012)

Hey, mir hat damals dieser Link hier sehr weitergeholfen, das Programm mit XML-Config welches ich damals verfasst habe darf ich leider nicht posten.

Java XML Tutorial

Ich hoffe ich kann dir damit helfen 
MFG Andy


----------



## nillehammer (14. Sep 2012)

Habe anhand Deines Codes nicht ganz verstanden, was du da machen willst. Aber du willst ja offensichtlich mehr als einen String aus der Methode rausgeben. Warum also nicht einen String[] als return-Wert oder eine Instanz einer selbst erstellten Ergebnis-Klasse mit entsprechenden Gettern?


----------



## ghyme (14. Sep 2012)

nillehammer hat gesagt.:


> Habe anhand Deines Codes nicht ganz verstanden, was du da machen willst. Aber du willst ja offensichtlich mehr als einen String aus der Methode rausgeben. Warum also nicht einen String[] als return-Wert oder eine Instanz einer selbst erstellten Ergebnis-Klasse mit entsprechenden Gettern?



Die For-Schleife erstellt mir jeweils Objekte mit den benötigten Attributen. Ich möchte diese Attribute in meiner Main-Funktion nutzen. 

Habe das probiert mit dem String[] als Rückgabewert, aber ich hab ja mehrere String-Arrays und kann nicht alle mit einem return Befehl zurückgeben.


----------



## nillehammer (14. Sep 2012)

Als return-Value geht auch String[][]. Aber mehrdimensionale Arrays find ich persönlich doch recht sperrig. Schreibe Dir dann lieber eine Klasse, die die einzelnen String-Arrays als Instanzvariablen hält und über Getter zugreifbar macht.
[EDIT]
Oder eine Klasse, die jeweils die Strings enthält, die Du über die gleiche Index-Nummer identifizierst und als Rückgabewert eine Liste/Array von Instanzen dieser Klasse.
[/EDIT]


----------



## Michael... (14. Sep 2012)

Warum die String Arrays? Warum gibst Du nicht einfach die List mit den DataPoint Objekten zurück? Die enthalten doch alle Informationen. Gerade mit XMLs lässt sich doch schön objektorientiert programmieren.

Die dauernde String-Verkettung von parsedData ist unschön besser mit StringBuffer oder StringBuilder arbeiten.


----------



## ghyme (14. Sep 2012)

Hab das Problem nun gelöst, habe als Rückgabewert Datapoint angegeben und mit return das erzeugte item zurückgegeben. Dann kann ich in der Main-Funktion mit z.B. item.getName() den String auslesen.

Vielen Dank!


----------



## Bernd Hohmann (14. Sep 2012)

ghyme hat gesagt.:


> ich entwickle gerade eine Android-App mit Java und habe ein grundsätzliches Problem mit Strings, die ich aus ner Funktion zurückgeben will.



4 Varianten:

Variante 1: Arrays werden "by reference" übergeben, da kann man etwas tricksen: Vorher die String-Arrays entsprechend dimensionieren und dann in der Methode befüllen. Du darfst halt in der Methode dann halt kein "xml_names = new String[]..." machen weil damit ein neues Objekt erzeugt wird. Nachteil: Du musst vorher wissen, wieviele Elemente da ankommen.


```
public class ByReference {
	public static void main(String[] args) {
		String x1[] = new String[2];
		String x2[] = new String[2];
		parseXML(x1, x2);
		System.out.println(x1[0] + " # " + x2[1]);
	}

	private static void parseXML(String xml_names[], String xml_states[]) {
		xml_names[0] = "Name 1";
		xml_names[1] = "Name 2";
		xml_states[0] = "State 1";
		xml_states[1] = "State 2";
	}
}
```

Variante 2: Wenn Du dieses Bündel an Arrays noch weiter herumreichen willst, würde ich mir eine Helferklasse bauen in der alle Arrays enthalten sind und dann die Helferklasse zurückgeben. Hat den Vorteil, dass Du die Daten komplett frisch in parseXML() erzeugen kannst. Nachteil: Du schleppst halt noch eine Klasse herum.


```
public class MyDataContainer {
    public String xml_names[]=null;
    public String xml_states[]=null;
  }

  // in public MyDataContainer parseXML():

  MyDataContainer mdc = new MyDataContainer();
  mdc.xml_names = new String[]....;
  mdc.xml_states = new String[]...
  ..
  return mdc;
```

Variante 3:

Eine Map oä. zurückgeben und über irgendwelche Namen indizieren. Vorteil: geht immer, Nachteil: vertipper im Key können böse in einer NPE enden - daher sowas in Konstanten packen.

  map.put("xml_names", xml_names);
  ....
  String s[]=map.get("xml_names");

Variante 4: wenn Du die Arrays nur lokal brauchst, pfeife auf die Subroutine und klatsch das in den Main-Code rein.

Bernd


----------

