Problem mit Exceptions

Specter

Grünschnabel
Moin Leute,

ich arbeite gerade an einem Programm für die Schule, mit dem ich erst Auswähle ob ich Client oder Server bin und dann entweder als Client eine Zufallszahl an einen bestimmten Rechner schicke, der dann als Server agiert und die Zufallszahl + Zeitstempel + IP des Senders ausgeben soll. Das Grundprogramm funktioniert auch, nun wollte ich halt eine GUI aufbauen und habe das soweit eigentlich fertig. Doch bekomm ich ständig irgendwelche Fehlermeldungen mit Exceptions, die mich irgendwie nur verwirren.

Hier mal mein kompletter Code, leider etwas unübersichtlich:
Code:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 08.09.2012
  */

public class GUI extends Frame {
  // Anfang Attribute
  private static int timeOut = 2000;
  private static int bufsize = 600;
  boolean state = true;

  MenuBar menuLeiste = new MenuBar();
  Menu menuDatei = new Menu("Datei");
  Menu menuAuswahl = new Menu("Auswahl");
  
  private Label label1 = new Label();
  private Label label2 = new Label();
  private Label label3 = new Label();
  private TextArea textArea1 = new TextArea("", 1, 1, TextArea.SCROLLBARS_NONE);
  private TextField textField1 = new TextField();
  private TextField textField2 = new TextField();
  private Label label4 = new Label();
  private Button sendClient = new Button();
  private Button stopServer = new Button();
  private Button startServer = new Button();
  // Ende Attribute

  public GUI(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { dispose(); }
    });
    int frameWidth = 300; 
    int frameHeight = 379;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Panel cp = new Panel(null);
    add(cp);
    // Anfang Komponenten

    label1.setBounds(16, 64, 46, 26);
    label1.setText("Host:");
    label1.setFont(new Font("Arial", Font.PLAIN, 18));
    cp.add(label1);
    label2.setBounds(16, 104, 46, 25);
    label2.setText("Port:");
    label2.setFont(new Font("Arial", Font.PLAIN, 18));
    label2.setVisible(false);
    cp.add(label2);
    label3.setBounds(80, 8, 146, 33);
    label3.setText("Network V1.0");
    label3.setFont(new Font("Arial", Font.PLAIN, 24));
    cp.add(label3);
    textArea1.setBounds(16, 176, 256, 108);
    textArea1.setEditable(false);
    textArea1.setEnabled(true);
    cp.add(textArea1);
    textField1.setBounds(72, 64, 126, 28);
    cp.add(textField1);
    textField2.setBounds(72, 104, 54, 28);
    textField2.setVisible(false);
    cp.add(textField2);
    label4.setBounds(16, 144, 46, 25);
    label4.setText("Data:");
    label4.setFont(new Font("Arial", Font.PLAIN, 18));
    cp.add(label4);
    sendClient.setBounds(24, 304, 75, 25);
    sendClient.setLabel("<< Send >>");
    sendClient.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        sendClient_ActionPerformed(evt);
      }
    });
    cp.add(sendClient);
    stopServer.setBounds(136, 304, 75, 25);
    stopServer.setLabel("<< Stop >>");
    stopServer.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt){
         stopServer_ActionPerformed(evt);
      }
    });
    cp.add(stopServer);
    startServer.setBounds(24, 304, 75, 25);
    startServer.setLabel("<< Start >>");
    startServer.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) { 
        startServer_ActionPerformed(evt);
      }
    });
    cp.add(startServer);
    // Ende Komponenten

    setVisible(true);
    menue();
  }

  // Anfang Methoden
  public void menue(){
   // Menü zusammenbauen
   MenuItem beenden = new MenuItem("Programm Beenden");
   beenden.addActionListener(new ActionListener(){
     public void actionPerformed(ActionEvent e){
      System.exit(0);
     }

   });
   MenuItem client = new MenuItem("Client");
   client.addActionListener(new ActionListener(){
     public void actionPerformed(ActionEvent e){
      textField1.setVisible(true);
      sendClient.setVisible(true);
      label1.setVisible(true);
      textField2.setVisible(true);
      label2.setVisible(true);

      startServer.setVisible(false);
      stopServer.setVisible(false);
      textArea1.setVisible(false);
      label4.setVisible(false);
     }

   });
   MenuItem server = new MenuItem("Server");
   server.addActionListener(new ActionListener(){
     public void actionPerformed(ActionEvent e){
      textField1.setVisible(false);
      sendClient.setVisible(false);
      label1.setVisible(false);

      startServer.setVisible(true);
      stopServer.setVisible(true);
      textArea1.setVisible(true);
      label4.setVisible(true);
      textField2.setVisible(true);
      label2.setVisible(true);
     }
   });
   
   menuDatei.add(beenden);
   menuAuswahl.add(client);
   menuAuswahl.add(server);
   
   // Menüs zur Menüleiste hinzufügen
   menuLeiste.add(menuDatei);
   menuLeiste.add(menuAuswahl);
   
   // Menüleiste zum Fenster hinzufügen
   setMenuBar(menuLeiste);
   
  }
  
  public void server() throws Exception {

    while(state == true){
      int port = Integer.parseInt(textField2.getText());
   
      DatagramSocket udpSocket = new DatagramSocket(port);
      DatagramPacket packetIn = new DatagramPacket(new byte [bufsize], bufsize);
      DatagramPacket packetOut = new DatagramPacket(new byte [bufsize], bufsize);
      
      while(true){
        udpSocket.receive(packetIn);
        
        textArea1.setText("" + packetIn.getAddress());
        textArea1.setText(new String(packetIn.getData()));
      }
    }
   
   
  }
  
  public void client(int daten){
    try{
     int port = Integer.parseInt(textField2.getText());
     String host = textField1.getText();
     Calendar c = Calendar.getInstance();
     String Zeit = c.getTime().toGMTString();
     String Nachricht = "";
     byte[] data = new byte[12];

     Nachricht = daten + " " + Zeit;
     data = Nachricht.getBytes();
     
     DatagramSocket udpSocket = new DatagramSocket();
     udpSocket.setSoTimeout(timeOut);
     InetAddress addr = InetAddress.getByName(host);
     DatagramPacket packetOut = new DatagramPacket(data,data.length,addr,port);
     udpSocket.send(packetOut);
     System.out.println(packetOut);
     udpSocket.close();
    } // end of try
    catch(Exception e) {
     System.err.println("Timeout: " + e.getMessage());
    }
  }
  
  public int randomNumber(){
    final int MAX = 100;
    int daten = 0;
    for (int i = 0; i < MAX; i++){
    daten = (int)Math.floor((Math.random() * 99) + 1);}

    return daten;
  }
  
  public void sendClient_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
    client(randomNumber());
  }

  public void stopServer_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
    state = false;
    server();
  }

  public void startServer_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
    state = true;
    server();

  }

  // Ende Methoden

  public static void main(String[] args) {
    new GUI("GUI");
  }
}

Und hier die dazugehörigen Fehlermeldungen:
Code:
GUI.java:227:11: error: unreported exception Exception; must be caught or declared to be thrown
    server();
          ^
GUI.java:233:11: error: unreported exception Exception; must be caught or declared to be thrown
    server();

Ich hoffe ihr könnt mir dabei irgendwie behilflich sein, denn ich verzweifle grad echt :D

Vielen Dank schonmal
 
Zuletzt bearbeitet:
Hi

Die Methode server
Java:
public void server() throws Exception
gibt hier an, möglicherweise im Fehlerfall eine Exception zu erzeugen.
Bei den Stellen, wo server aufgerufen wird,
musst du daher mit try-catch eine Fehlerbehandlung für den Fall einbauen.

Oder du nimmst das "throws Exception" raus, da es nicht beabsichtigt scheint.
server throwt nämlich gar nichts innen drin von sich aus.

PS: Endlosschleifen wie deine sind schlecht.
 
Oh man, das war ja 'n dummer fehler :D

Danke dir, jetzt läuft's auch.

Könntest du mir evtl. noch ein paar Anregungen geben um das alles etwas übersichtlicher zu machen? Bin noch ein ziemlicher Anfänger bei Java bzw. im Programmieren allgemein...

Vielen Dank nochmal ;)

EDIT:

Wenn ich als Server agiere hänge ich ja in einer Endlosschleife, wie komme ich da raus? Ich würde das ganze ja gerne per Button klick beenden, aber das scheint nicht zu funktionieren :/

EDITH: Welche andere Möglichkeit gäbe es denn sonst, als es mit 'ner Endlosschleife zu machen? Das Programm muss ja immerhin ständig abfragen ob was ankommt, das geht doch garnicht anders :eek:
 
Zuletzt bearbeitet:
Hi

zur Endlosschleife:
Schon eine Schleife machen, aber mit einer Möglichkeit,
beim Programmende etc. wieder zu Ende zu sein.
Also praktisch das andere Edit :)

Und das wird etwas umständlicher.
Zurzeit hast du ziemlich alles in der GUI
(was dazu führen sollte, das die Grafik bei der Serverschleife einfriert).
Du brauchst einen Thread, wo das Schleifenzeug reinkommt.
Weiters: invokeLater zum zugreifen auf das Textfeld
Und noch sicherstellen,d ass der Thread mit Socket etc. beim Programmende geschlossen wird.


Übersichtlichkeit etc.:

Lager die eigentlichen Funktionen (Client/Server/...) in eigene Klassen aus
und mach in der GUI wirklich nur die GUI.

Längere Methoden mehr strukturieren, zB. Variablen an den Anfang statt irgendwo reingemischt.

Das, was du mit deinen Actionlistenern bei der Erzeugung machst, ist seltsam.
Normalerweise sollten das eigenständige Methode sein (vor allem die Längeren).
Dazu die passenden Interfaces bei GUI inkludieren und dann nur den Methodennamen bei setActionlistener hinschreiben. Siehe auch Onlinebuch Javainsel.

Zum Socket: Warum Datagram, also UDP?
Falls du Wert darauf legst, das die Nachrichten
zuverlässig ankommen und nicht durcheinander sind, nimm TCP.

Wenn man eine generelle Exception abfangt, warum "Timeout" ausgeben?
Könnte auch was anderes sein.
Wenn man eine spezielle Meldung für den Timeoutfall haben will
gibts sicher auch eine spezielle Timeoutexception, die man separat behandeln kann.

Bei randomNumber erzeugst du 99 Zufallszahlen umsonst und brauchst nur die Hundertste.
 

Neue Beiträge

Zurück