# Main Methode wird nicht aufgerufen



## k_g (16. Jun 2011)

Hallo mein programm ist fast am ende, jedoch funktioniert irgendeine sache nicht. ich hoffe jemand findet einen fehler. und zwar : main methode zum senden der anfrage + auslesen der datei werden nie aufgerufen. und wenn main zu constructor > fehler durch exeptions.
hier sind meine 3 klassen:

klasse 1 connector

```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JOptionPane;


public class Connector {

	private static String startDatum;
	private static String endDatum;
	static String data;
	
	
	//public Connector()	{
		
	//}
	
	/**
	 * @param args
	 * @throws IOException 
	 * @throws UnknownHostException 
	 */
	public static void main(String[] args) throws UnknownHostException, IOException {
		
		startDatum = JOptionPane.showInputDialog(null,"Bitte StartDatum eingeben","Datumseingabe",JOptionPane.PLAIN_MESSAGE);
		endDatum = JOptionPane.showInputDialog(null,"Bitte EndDatum eingeben","Datumseingabe",JOptionPane.PLAIN_MESSAGE);
		
		
		System.out.println("XML");
			
		data = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">  <soap:Body>    <getMessungenAktuell xmlns=\"http://pegelonline.wsv.de/webservices/version2_3/2007/10/31\">      <parameterName>WASSERSTAND ROHDATEN</parameterName>      <messstellenNummern></messstellenNummern>      <messstellenNamen>FRANKFURT OSTHAFEN</messstellenNamen>      <start>" +
		    		"" +
		    		startDatum +
		    		"</start>      <ende>" +
		    		endDatum + //format:   2011-06-16T14:00:00
		    		"</ende>    </getMessungenAktuell>  </soap:Body></soap:Envelope>";
		    String hostname = "www.pegelonline.wsv.de";
		    int port = 80;
		    InetAddress addr = InetAddress.getByName(hostname);

		    System.out.println(addr.toString());
		    
		    Socket socket = new Socket(addr, port);


		    String path = "/webservices/version2_3/2007/10/31/PegelonlineWebservice";
		    BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
			System.out.println("Writer");
		    wr.write("POST " + path + " HTTP/1.0\r\n");
		    wr.write("Content-Length: " + data.length() + "\r\n");
		    wr.write("Content-Type: text/plain; charset=UTF-8\r\n");
		    wr.write("SOAPAction: getMessungenAktuell\r\n");
		    wr.write("\r\n");

		    wr.write(data);
		    wr.flush();
		    
			System.out.println("Write");
			
		    BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		    String line;
		    while ((line = rd.readLine()) != null) {
		      System.out.println(line);
		    }
			System.out.println("While");
		    wr.close();
		    rd.close();
		    socket.close();
		    
		    
		    //System.out.println("TEST: " + datum);
		  }

	public static String getStartDatum() {
		return startDatum;
	}

	public void setStartDatum(String startDatum) {
		this.startDatum = startDatum;
	}

	public static String getEndDatum() {
		return endDatum;
	}

	public void setEndDatum(String endDatum) {
		this.endDatum = endDatum;
	}


}
```

klasse 2 programm


```
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

/**
 * @author Konstantin
 *
 */
public class Programm extends JFrame implements ActionListener	{

	private final int BREITE = 350;
	private final int HOEHE = 250;
	private final int X0 = 200;
	private final int Y0 = 200;
	
	private JButton berechnenB	= new JButton("Berechnen");
	private JButton endeB		= new JButton("Beenden");
	
	private JPanel flaecheP = new JPanel();
	
	private JLabel eingabeMusterL	= new JLabel("Eingabemuster:");
	private JLabel eingabeMusterT	= new JLabel("Beispiel (2011-06-16T14:00:00) ");
	
	private JLabel pegelL = new JLabel("Pegel:");
	private JLabel pegelT = new JLabel("Frankfurt Osthafen");
	
	private JLabel startL = new JLabel("Start Zeit: ");
	private JTextField startT = new JTextField("");
	
	private JLabel endeL = new JLabel("Ende Zeit: ");
	private JTextField endeT = new JTextField("");
	
	private JLabel leer1 = new JLabel("----------------------"); //abstandhalter
	private JLabel leer2 = new JLabel("----------------------"); //abstandhalter
	
	private JLabel standL = new JLabel("Stand (in m²):");
	private JLabel standT = new JLabel("00000000000");
	
	
	Connector connector = new Connector();
	XML xml = new XML();
	
	public Programm()	{
		super("Wasserstand");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(BREITE, HOEHE);
		setLocation(X0, Y0);
		setMaximumSizes();
		implementActionlistener();
		flaecheAnordnen();
		setResizable(true);
		setVisible(true);
	}

	
	//main Methode
	public static void main(String[] args) {
		new Programm();
	}

	private void setMaximumSizes()	{
		pegelT.setMaximumSize(new Dimension(200,20));
		startT.setMaximumSize(new Dimension(200,20));
		endeT.setMaximumSize(new Dimension(200,20));
	}
	
	private void flaecheAnordnen()	{
		
		add(flaecheP);
		
		// Anordnung vereinbaren
		GroupLayout dgLayout = new GroupLayout(flaecheP);
		flaecheP.setLayout(dgLayout);
	
		// voreingestellte Lücken verwenden
		dgLayout.setAutoCreateGaps(true);
		dgLayout.setAutoCreateContainerGaps(true);

		// senkrechte Gruppierung vereinbaren
		dgLayout.setVerticalGroup(dgLayout.createSequentialGroup().
				addGroup(dgLayout.createParallelGroup().
					addComponent(eingabeMusterL).addComponent(eingabeMusterT)).
				addGroup(dgLayout.createParallelGroup().
					addComponent(pegelL).addComponent(pegelT)).
				addGroup(dgLayout.createParallelGroup().
					addComponent(startL).addComponent(startT)).
				addGroup(dgLayout.createParallelGroup().
					addComponent(endeL).addComponent(endeT)).
				addGroup(dgLayout.createParallelGroup().
					addComponent(standL).addComponent(standT)).
				addGroup(dgLayout.createParallelGroup().
					addComponent(leer1).addComponent(leer2)).
				addGroup(dgLayout.createParallelGroup().
					addComponent(berechnenB).addComponent(endeB))
				);

		// waagerechte Gruppierung vereinbaren
		dgLayout.setHorizontalGroup(dgLayout.createSequentialGroup().
			addGroup(dgLayout.createParallelGroup().
				addComponent(eingabeMusterL).addComponent(pegelL).addComponent(startL).addComponent(endeL).
				addComponent(standL).addComponent(leer1).addComponent(berechnenB)).
			addGroup(dgLayout.createParallelGroup().
				addComponent(eingabeMusterT).addComponent(pegelT).addComponent(startT).addComponent(endeT).
				addComponent(standT).addComponent(leer2).addComponent(endeB))
		);
	}
		
	private void implementActionlistener() {
		berechnenB.addActionListener(this);
		endeB.addActionListener(this);
	}
	
	@Override
	public void actionPerformed(ActionEvent event) {
		if(event.getSource() == berechnenB)	{
			
			String start = startT.getText().toString();
			String ende = endeT.getText().toString();
			
			Connector connector = new Connector();
			
			connector.setStartDatum(startT.getText().toString());
			connector.setEndDatum(endeT.getText().toString());
			//main methode zum senden der anfrage + auslesen der datei werden nie aufgerufen
			//wenn main zu constructor > fehler durch exeptions
			
			
			String stand = xml.getlastMesswert();
			standT.setText(stand);
			
			XML xml = new XML();
			
			System.out.println("Start: " + Connector.getStartDatum());
			System.out.println("Ende: " + Connector.getEndDatum());
			System.out.println("Stand: " + stand);
		}
		else if(event.getSource() == endeB)	{
			dispose();
			System.exit(0);
		}
	}
}
```

klasse 3 xml


```
/**
 * 
 */

/**
 * @author Konstantin 
 *
 */

import java.io.IOException;
import java.util.Iterator;
import java.util.List;
 
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
 
                
public class XML {

	private static String lastWert = "error";
	
	public XML	() {
		
	}

	public static void main (String[]args) throws JDOMException, IOException 
	{
		
		String filename = "response.xml";

		Document doc = new SAXBuilder().build(filename);
		Element envolpe = doc.getRootElement();
		Element body = envolpe.getChild("Body", envolpe.getNamespace());
		Namespace ns = Namespace.getNamespace("ns","http://pegelonline.wsv.de/webservices/version2_3/2007/10/31");
		List<Element> anfrage = body.getChildren("getMessungenAktuellResponse",ns);
		
		for (Element element : anfrage) {
			List<Element> antworten = element.getChildren("getMessungenAktuellReturn", ns);
			for (Element e : antworten) {
				String messwert = e.getChildText("messwert", ns);
				System.out.println(messwert.trim());
				String zeitpunkt = e.getChildText("zeitpunkt", ns);
				System.out.println(zeitpunkt.trim());
				
				lastWert = messwert;
				
			}
		}
		
		System.out.println("----: " + lastWert);
	}
	public String getlastMesswert()	{
		return lastWert;
	}
	
	public void setlastMesswert(String lastWert)	{
		this.lastWert = lastWert;
	}
}
```

Danke


----------



## Murray (16. Jun 2011)

I.d.R. hat man nur eine main-Methode; hier sind es derer aber drei.

Wie rufst Du das Programm denn auf?


----------



## k_g (16. Jun 2011)

mit der 2 klasse programm wird es aufgerufen


----------



## Marco13 (16. Jun 2011)

Nur überflogen... und so einen Satz wie 


> und wenn main zu constructor > fehler durch exeptions.


:autsch: ... ach, egal: Im zweifelsfall kannst du die main in den Konstruktor packen (was du mit diesem Satz vermutlich meintest) und einen einen try/catch block drumwickeln. Das ist natürlich immernoch Unfug, aber statt der main sollte es eben eine spezielle Methode vom connector geben, die das macht, was jetzt in der main steht, und die von außen aufgerufen werden kann.


----------



## k_g (16. Jun 2011)

hmm ok habs nicht genau verstanden wie ich das jetzt machen soll


----------



## Murray (17. Jun 2011)

Erwartest du, dass durch den Aufruf eines Konstuktors einer Klasse die dort definierte main-Methode ausgeführt wird? Das ist nicht der Fall.

Wenn du also in Klasse 2 in actionPerformed 
	
	
	
	





```
new XML();
```
 aufrufst, dann passiert nicht mehr und nicht weniger, als dass der Default-Konstruktor der Klasse XML aufgerufen wird. Und der macht - genau gar nichts.


----------



## k_g (17. Jun 2011)

hab meine xml klasse jetzt so geändert
was mache ich beim try und catch weil davon habe ich gar keine ahnung


```
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
 
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
 
                
public class XML {

	 private static String lastWert = "error";
	 
	 public XML () {
	  try {
	   bauen();
	  } catch (JDOMException e) {
	   // TODO Auto-generated catch block
	   e.printStackTrace();
	  } catch (IOException e) {
	   // TODO Auto-generated catch block
	   e.printStackTrace();
	  }
	 }

	 public static void bauen() throws JDOMException, IOException 
	 {
		
		String filename = "response.xml";

		Document doc = new SAXBuilder().build(filename);
		Element envolpe = doc.getRootElement();
		Element body = envolpe.getChild("Body", envolpe.getNamespace());
		Namespace ns = Namespace.getNamespace("ns","http://pegelonline.wsv.de/webservices/version2_3/2007/10/31");
		List<Element> anfrage = body.getChildren("getMessungenAktuellResponse",ns);
		
		for (Element element : anfrage) {
			List<Element> antworten = element.getChildren("getMessungenAktuellReturn", ns);
			for (Element e : antworten) {
				String messwert = e.getChildText("messwert", ns);
				System.out.println(messwert.trim());
				String zeitpunkt = e.getChildText("zeitpunkt", ns);
				System.out.println(zeitpunkt.trim());
				
				lastWert = messwert;
				
			}
		}
		
		System.out.println("----: " + lastWert);
	}
	public String getlastMesswert()	{
		return lastWert;
	}
	
	public void setlastMesswert(String lastWert)	{
		this.lastWert = lastWert;
	}
}
```


----------



## Marco13 (17. Jun 2011)

EDIT: Ja, da war ich schon zu langsam... morgen mehr dazu...

Ja, du KÖNNTEST sowas machen wie

```
public Connector()    {
           try
           {
               Connector.main(null); // HACK
           }
           catch (Exception e) // HACK
           {
               e.printStackTrace();
           }
        
      }
```
aber das ist eben grob gehackt. Das, was jetzt in der Connector.main steht, sollte in einer "normalen" Methode vom Connector stehen, und von Programm aus sollte man dann eben
Connector connector = new Connector();
connector.normaleMethod();
machen - aber das wäre auch nur der erste Schritt...


----------



## k_g (17. Jun 2011)

das funktioniert trotzdem so nicht 
die anfrage wird nicht gesendet und somit bekomme ich auch keine antwort und die anfrage wird nicht aktualisiert


----------



## XHelp (17. Jun 2011)

Was genau passiert denn? Was genau steht auf der Konsole? Bis zu welchem Punkt wird ausgeführt? Was erwartest du, dass da passiert? Und das alles am besten mit verständlichen Sätzen 
Da war auch die Rede von "Ich Tarzan > Du Jane, Sie Methode > Es Exception". *Welche* Exception?


----------



## k_g (17. Jun 2011)

ich hab jetzt hier was geändert
und zwar so 

```
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
 
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
 
                
public class XML {

	private static String lastWert = "error";
	
	public XML	() {
		try {
			bauen();
		} catch (JDOMException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void bauen() throws JDOMException, IOException 
	{
		
		String filename = "C:/Users/loni/Desktop/BA-Konst/response.xml";//Hier pfad ändern

		Document doc = new SAXBuilder().build(filename);
		Element envolpe = doc.getRootElement();
		Element body = envolpe.getChild("Body", envolpe.getNamespace());
		Namespace ns = Namespace.getNamespace("ns","http://pegelonline.wsv.de/webservices/version2_3/2007/10/31");
		List<Element> anfrage = body.getChildren("getMessungenAktuellResponse",ns);
		
		for (Element element : anfrage) {
			List<Element> antworten = element.getChildren("getMessungenAktuellReturn", ns);
			for (Element e : antworten) {
				String messwert = e.getChildText("messwert", ns);
				System.out.println(messwert.trim());
				String zeitpunkt = e.getChildText("zeitpunkt", ns);
				System.out.println(zeitpunkt.trim());
				
				lastWert = messwert;
				
			}
		}
		
	}
	public String getlastMesswert()	{
		return lastWert;
	}
	
	public void setlastMesswert(String lastWert)	{
		this.lastWert = lastWert;
	}
}
```

und 2 klasse

```
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JOptionPane;


public class Connector {

	private static String startDatum;
	private static String endDatum;
	static String data;
	
	
	public Connector(String startDatum, String endDatum)	{
		Connector.startDatum = startDatum;
		Connector.endDatum = endDatum;
		
		try {
			bauen();
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * @param args
	 * @throws IOException 
	 * @throws UnknownHostException 
	 */
	public void bauen() throws UnknownHostException, IOException {
		
		
		
		System.out.println("XML");
			
		data = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">  <soap:Body>    <getMessungenAktuell xmlns=\"http://pegelonline.wsv.de/webservices/version2_3/2007/10/31\">      <parameterName>WASSERSTAND ROHDATEN</parameterName>      <messstellenNummern></messstellenNummern>      <messstellenNamen>FRANKFURT OSTHAFEN</messstellenNamen>      <start>" +
		    		"" +
		    		startDatum +
		    		"</start>      <ende>" +
		    		endDatum + //format:   2011-06-16T14:00:00
		    		"</ende>    </getMessungenAktuell>  </soap:Body></soap:Envelope>";
		    String hostname = "www.pegelonline.wsv.de";
		    int port = 80;
		    InetAddress addr = InetAddress.getByName(hostname);

		    System.out.println(addr.toString());
		    
		    Socket socket = new Socket(addr, port);


		    String path = "/webservices/version2_3/2007/10/31/PegelonlineWebservice";
		    BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
			System.out.println("Writer");
		    wr.write("POST " + path + " HTTP/1.0\r\n");
		    wr.write("Content-Length: " + data.length() + "\r\n");
		    wr.write("Content-Type: text/plain; charset=UTF-8\r\n");
		    wr.write("SOAPAction: getMessungenAktuell\r\n");
		    wr.write("\r\n");

		    wr.write(data);
		    wr.flush();
		    
			System.out.println("Write");
			
		    BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		    String line;
		    while ((line = rd.readLine()) != null) {
		      System.out.println(line);
		    }
			System.out.println("While");
		    wr.close();
		    rd.close();
		    socket.close();
		    
		    
		    
		  }

	public static String getStartDatum() {
		return startDatum;
	}

	public void setStartDatum(String startDatum) {
		this.startDatum = startDatum;
	}

	public static String getEndDatum() {
		return endDatum;
	}

	public void setEndDatum(String endDatum) {
		this.endDatum = endDatum;
	}


}
```

Werte werden von textfeldern Start und Ende korrekt an Connector übergeben. Textfeld Stand wird der richtige wert aus der XML (der letzte der liste) zugewiesen. 
die konsole übergibt die richtigen werte an die seite, über den XML wert. das problem hierbei ist: die xml datei wird nicht erneuert, mit neuen werten gespeichert.


----------



## XHelp (17. Jun 2011)

k_g hat gesagt.:


> die xml datei wird nicht erneuert, mit neuen werten gespeichert.



Wie auch? Du schreibst auch an keiner Stelle irgendwas in irgendeine Datei. Oder übersehe ich etwas?


----------



## k_g (17. Jun 2011)

ja und wie kann ich das machen das die werte die in meiner console ausgegebn werden da rein geschrieben werden


----------



## XHelp (17. Jun 2011)

Let me google that for you
Statt den Sysouts eben irgendwas verwenden, was in eine Datei schreiben


----------



## k_g (17. Jun 2011)

Und was kann ich benutzen um das zu schreiben. JDOM?


----------



## Marco13 (17. Jun 2011)

Nee, der String ist ja schon XML. Wenn du sowas hast wie

```
String s = "<someTag>someData</someTag>";
```
kannst du das mit sowas schreiben wie

```
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("datei.xml")));
bw.writeLine(s);
bw.close();
```
(aus'm Kopf)


----------

