# Hilfe: toString() ...



## fenerli23 (10. Januar 2008)

hi,
wie kann ich meine toString() Methode so realisieren, dass hier auch ausser String, int, double und etc implementiert werden können damit eine sorgfälltige ausgabe entsteht:

```
String zeile = null;
//getter und setter

// int, double, date muss auch irgendwie mit hinein...
public String toString() {
		StringBuffer b = new StringBuffer();
		b.append(zeile);	
		return b.toString();
	}
```

Danke im Voraus


----------



## zerix (10. Januar 2008)

Hallo,

ich verstehe nicht so ganz was du möchtest.

MFG

zEriX


----------



## MiMi (10. Januar 2008)

Du kannst doch einfach in deinem toString alles eingeben ala:
int zahl = 20;


return zeile + ": "+ zahl;


----------



## fenerli23 (10. Januar 2008)

das problem ist wenn ich keine toString() Methode mit hineinbeziehe wird etwas kommisch ausgegeben wie:

```
meinpacke.className232443
```

da der richtig Inhalt ausgegeben werden soll muss ich eine toString()- Methode definieren...

@MIMI
mmh wie du das realisiert hast hatte ich auch schon probiert aber dann wird alles nacheinander ausgegeben z.b:
Hallo:1993-02-06

mmh kann man das nicht elegant lösen ...?


----------



## MiMi (10. Januar 2008)

Wie willst du es denn ausgegeben haben?


----------



## Dunkelzahn (10. Januar 2008)

Die von dir beschriebene Ausgabe kommt von der toString-Methode in der Object-Klasse, von der alle anderen Objekte ableiten.

toString gibt einen String zurück und nichts anderes, dementsprechend kannst du diesen auch nur entsprechend formatieren. So kannst du natürlich Leerzeichen und ähnliches einfügen:

```
return "Testausgabe: "+ausgabe1+", "+ausgabe2+"...";
```
Unter anderem kannst du auch Zeilenumbrüche ausgeben:

```
return "Testausgabe: Zeile1\nZeile2\nNoch eine Zeile";
```
hth


----------



## fenerli23 (10. Januar 2008)

MiMi hat gesagt.:


> Wie willst du es denn ausgegeben haben?



ich will das so: Wenn ein String ausgegben wird, soll auch nur ein String ausgegeben werden, denn es geht um Daten aus einer Tabelle...
die wiederum in einem Array hinterlegt werden ...

z.B: so ..

arr(1): Helmut
arr(2): 1984-02-02
arr(3): 5 

und nicht so:
arr(1): Helmut:null:null
arr(2): null:1984-02-02:null
arr(3): null:null:5


----------



## MiMi (10. Januar 2008)

Du kannst auch einfach die Daten ueber nen getter abfragen, mittels "getName()" oder "getGeburtstag()" etc. 
Oder du machst in deiner toString methode ne abfrage, das wenn eins von den Sachen NULL ist, soll er es net zurueckgeben sonst wohl.


----------



## fenerli23 (10. Januar 2008)

ich zeig am besten mal die Methoden ... wie ich das zur Zeit habe geschieht nur so eine Ausgabe:
arr(1): Pataballa
arr(2): Heidi
arr(3): null
arr(4): null

Line- Methode..

```
import java.text.SimpleDateFormat;
import java.util.Date;

public class Line {

	private String zeile = null;
	private Date gebDatum = null;
	private int zeileInt = 0;
	
	private static final SimpleDateFormat DATEFORMAT = new SimpleDateFormat("dd.MM.yyyy");
	
	
	public String getZeile() {
		return zeile;
	}
	public void setZeile(String zeile) {
		this.zeile = zeile;
	}
	
	
	public int getZeileInt() {
		return zeileInt;
	}
	public void setZeileInt(int zeileInt) {
		this.zeileInt = zeileInt;
	}
	public Date getGebDatum() {
		return gebDatum;
	}
	public void setGebDatum(Date gebDatum) {

		this.gebDatum = gebDatum;
	}
	public String getGebDatumAsString(){ 
	    return DATEFORMAT.format(gebDatum); 
    }
	
	//damit das Objekt ausgegeben werden kann ...
	public String toString() {
		StringBuffer b = new StringBuffer();
		b.append(zeile);
		return b.toString();
	}
	
}
```

Methode Person. 

```
public class Person { 
	private Column[] columns = null;
	private Line[] lines = null;
	
	public Line[] getLines() {
		return lines;
	}
	public void setLines(Line[] lines) {
		this.lines = lines;
	}
	public Column[] getColumns() {
		return columns;
	}
	public void setColumns(Column[] columns) {
		this.columns = columns;
	}
}
```

"HaupKlasse"...

```
Line[] lines = new Line[md.getColumnCount()];
			if(rs.next()) {
				for (int i=1; i<=md.getColumnCount(); i++) {
					person = new Person();
					lines[i-1]= new Line();
					if (columns[i-1].getType().equals("NUMBER")){
						lines[i-1].setZeileInt(rs.getInt(i));	
					}
					if (columns[i-1].getType().equals("VARCHAR2")){
						lines[i-1].setZeile(rs.getString(i));
					}
					if (columns[i-1].getType().equals("DATE")){
						lines[i-1].setGebDatum(rs.getDate(i));
					}
					person.setLines(lines);
					System.out.println("Line(" + i + "): " + person.getLines()[i-1]);
				}		  
			}
```


----------



## slotyman (10. Januar 2008)

So wie das aussieht schreibst du deine Daten auch nicht optimal in dein Array.
Du machst drei Lines-Objekte auf.
In das eine schreibst du den ersten Wert (VARCHAR2), DATE und NUMBER bleiben null.
In das nächste schreibst du den Wert (DATE), VARCHAR und NUMBER bleiben null.
In das letzte schreibst du den Wert (NUMBER), VARCHAR und DATE bleiben null.

Ich glaub nicht, dass das so gewollt ist.

Erweitere doch lieber deine Personenklasse um drei Member un fülle die und lies die dann entsprechend aus....

Oder benutze kein Array für dein Line-Objekt


```
if(rs.next()) {
lines= new Line();
person = new Person();

				for (int i=1; i<=md.getColumnCount(); i++) {
					
					
					if (columns[i-1].getType().equals("NUMBER")){
						lines.setZeileInt(rs.getInt(i));	
					}
					if (columns[i-1].getType().equals("VARCHAR2")){
						lines.setZeile(rs.getString(i));
					}
					if (columns[i-1].getType().equals("DATE")){
						lines.setGebDatum(rs.getDate(i));
					}
					
				}	
	                person.setLines(lines);
					System.out.println("Line(" + i + "): " + person.getLines());
			}
```

Und bei Person:

```
private Line lines = null;
	
	public Line getLines() {
		return lines;
	}
	public void setLines(Line lines) {
		this.lines = lines;
	}
```


----------



## fenerli23 (10. Januar 2008)

so wie du das gemach hast kann ich das ganze gar nicht realisieren....,

ich brauche eine hilfe explizit für die toString() Methode damit alle Datentypen ausgegeben werden könne...

kann man das nicht irgendwie realisieren damit das alles schön klapp?!


----------



## slotyman (10. Januar 2008)

Wofür soll die toString-Methode den gut sein ? Wenn gibt die doch eh nur das VARCHAR2 Objekt wieder...

Vielleicht nimmst du einfach drei member in deiner Personenklasse auf:


```
int number;
String varChar2;
Date date;
```

machst dafür getter und setter

und wenn du dann das ganze formatiert zurückgeben möchtest machst du dir dafür Extra Methoden z.B.


```
public String getZeile()
{
  return "VARCHAR2:"+this.getVarChar2()+" Number:"+this.getNumber()+" DATE:"+DATEFORMAT.format(this.getDate());
}
```


----------



## fenerli23 (10. Januar 2008)

slotyman hat gesagt.:


> Wofür soll die toString-Methode den gut sein ? Wenn gibt die doch eh nur das VARCHAR2 Objekt wieder...



genau zur Zeit gibt sie nur das VARCHAR2 Objekt zurück ich würde zu gerne, dass diese Methode auch "NUMBER" und "DATE" zurück geben kann ... kann man das nicht irgendwie realisieren...?!


----------



## slotyman (10. Januar 2008)

Das ist zwar nicht schön, aber du kannst das dann so machen:


```
public String toString() {
		StringBuffer b = new StringBuffer();
                if(zeile!=null)
		      b.append(zeile);
                if(gebDatum!=null)
                      b.append(gebDatum);
                if(zeileInt!=0)
                      b.append(zeileInt);
		return b.toString();
	}
```

D.h. der String wird nur mit den Daten gefüllt die da sind und in deinem Falle wäre ja immer nur eine der drei gefüllt.


----------



## MiMi (11. Januar 2008)

@slotyman
Das hab ich ihm auch schon so geschrieben, nen ganzes Stueck weiter oben. Und wenn du immer direkt Code postet, meinst du das der Fragensteller dann noch nachdenkt ueber das eigentliche Problem?

@fenerli23
Machs mit gettern! Das ist die beste Methode dafuer! Wenn du das nur net machst, weil du keine Ahnung hast, schau nen Stueck weiter oben in dem Beitrag von Slotyman von; 10.01.08, 16:40


----------



## fenerli23 (11. Januar 2008)

nun erstmal danke für eure hilfen ...

ich wollte das ganze mit einem Client nun testen jedoch kriege ich jetz diese Fehlermeldung ... was genau sagt diese Fehlermeldung aus.

```
org.apache.axis2.AxisFault: java.lang.reflect.InvocationTargetException
	at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:486)
	at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:343)
	at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:389)
	at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:211)
	at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
	at meinpackage.TestStub.getPerson(TestStub.java:1560)
	at meinpackage.Client.main(ClientPerson.java:32)
```

in Zeile 32 steht folgendes:

```
resp = stub.getPerson(request);
```


----------



## slotyman (11. Januar 2008)

Das kann so ziemlich alles bedeuten, da es ja nur eine weitergeleitete Exception ist.
Beim Aufruf ist beim Ziel irgendetwas schief gegangen.

z.B.  es gibt dort kein Objekt oder es ist null oder .....


----------

