# Probleme beim Senden von Nachrichten an den Server



## Zel2491 (14. Mrz 2012)

Moin moin,

ich habe einen Server + Client und möchte jetzt eine Nachricht an den Server schicken...wenn ich das tue wirft er mir aber folgende Fehlermeldung aus:


Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at network.Client.<init>(Client.java:43)



Das ist jetzt stark gekürzt, allerdings ist der wichtigste Teil dabei:

[java=43]
out.write(sf.getUsertxt());
[/code]
out ist halt mein writer, und sf ist eine Instanz meiner Klasse StartingFrame - getUsertxt() sollte klar sein, da zieh ich halt den Inhalt aus meinem Textfeld heraus.

Naja, jedenfalls wirft er dabei halt diese Fehlermeldung - weiß jemand, woran das liegt?^^

Gruß Zel


----------



## VfL_Freak (14. Mrz 2012)

Moin,



Zel2491 hat gesagt.:


> Das ist jetzt stark gekürzt, allerdings ist der wichtigste Teil dabei:


:lol:  der war gut 



Zel2491 hat gesagt.:


> ich habe einen Server + Client und möchte jetzt eine Nachricht an den Server schicken...wenn ich das tue wirft er mir aber folgende Fehlermeldung aus:
> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
> at network.Client.<init>(Client.java:43)
> 
> ...


Wenn das wirklich die genannte Zeile 43 ist, sollte ja wohl eines der beiden Objekte (out oder sf) null sein, was sich im Debugger schnell zeigen dürfte!

Wie steht denn der Text im Frame ??

Vielleicht wären doch 2 oder 3 weitere Codezeilen gut !! Vorsicht: Ironie 

Gruß
Klaus


----------



## Zel2491 (14. Mrz 2012)

Ja ne  Ich wollt nur nicht da 42 Zeilen Fehlermeldung auswerfen^^ 

Bin bedingt schon selber weitergekommen:

mein sf war null...da hattest du schonmal Recht^^

Emm, ich hab das jetzt soweit geändert...ach ich poste einfach quellcode 



```
public Client(String ip, UserInterfaceClient uic, StartingFrame sf) {
        this.ip = ip;
        this.uic = uic;
        this.sf = sf;

        try {

            server = new Socket(this.ip, 2100);
            in =
                new BufferedReader(new InputStreamReader(
                    server.getInputStream()));

            out = new OutputStreamWriter(server.getOutputStream());
            out.write(this.sf.getUsertxt());

            JOptionPane.showMessageDialog(null, "Verbindung hergestellt");
```

Nur hab ich halt jetzt das Problem, dass ich, wenn ich 
	
	
	
	





```
new Client(...);
```
 aufrufe, einen Parameter des Typs StartingFrame übergeben muss...


```
client = new Client(ipAdresstxt.getText(), uic, sf);
```

wobei sf: 
	
	
	
	





```
private StartingFrame sf;
```
ist, allerdings initialisiere ich sf nicht, da ich nicht genau weiß, wie ich das initialisieren soll --> 

```
sf = new StartingFrame();
```
kanns ja nicht sein, weil ich dann ja einen neuen Frame erzeuge...

OOP ist einfach nicht meine größte Stärke xD


Edith:

Hier nochmal die ganze Fehlermeldung, wenn sie Dir hilft bin ich zufrieden^^




Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at network.Client.<init>(Client.java:44)
	at gui.StartingFrame$MyKeyListener.keyPressed(StartingFrame.java:130)
	at java.awt.Component.processKeyEvent(Component.java:6331)
	at javax.swing.JComponent.processKeyEvent(JComponent.java:2801)
	at java.awt.Component.processEvent(Component.java:6150)
	at java.awt.Container.processEvent(Container.java:2085)
	at java.awt.Component.dispatchEventImpl(Component.java:4735)
	at java.awt.Container.dispatchEventImpl(Container.java:2143)
	at java.awt.Component.dispatchEvent(Component.java:4565)
	at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
	at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
	at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
	at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
	at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
	at java.awt.Component.dispatchEventImpl(Component.java:4607)
	at java.awt.Container.dispatchEventImpl(Container.java:2143)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4565)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:679)
	at java.awt.EventQueue.access$000(EventQueue.java:85)
	at java.awt.EventQueue$1.run(EventQueue.java:638)
	at java.awt.EventQueue$1.run(EventQueue.java:636)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$2.run(EventQueue.java:652)
	at java.awt.EventQueue$2.run(EventQueue.java:650)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:649)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


----------



## VfL_Freak (14. Mrz 2012)

Moin,

tja, nun kennen wir leider weder Deine Klasse "startingFrame" noch wissen wir, was die Funktion "getUsertxt()" wirklich macht ..... :noe:

Was stört Dein Programm denn an der genannten Variante?

Gruß
Klaus

*[EDIT]*
gerade erst Dein edit gelesen ;-)



> at gui.StartingFrame$MyKeyListener.keyPressed(StartingFrame.java:130)



Was steht denn in dieser Zeile 130 ???:L


----------



## Zel2491 (14. Mrz 2012)

Aaaaalso:

in Zeile 130 steht:

[java=130]
client = new Client(ipAdresstxt.getText(), uic, sf);
[/code]
und direkt im Anschluss folgt dann:

```
Thread clientThread = new Thread(client);
clientThread.start();
```

Der wird irgendwas an "sf" rummäkeln wollen...

Ich poste einfach mal die Klasse StartingFrame...nützt nix, wenn ich da nur 2 Zeile draus schreibe



```
package gui;

import network.*;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class StartingFrame extends JFrame {

    private static final long serialVersionUID = -687330130050065776L;

    private JLabel username = new JLabel("Enter Nickname:");

    private JTextField usertxt = new JTextField(10);

    private JLabel ipAdress = new JLabel("Enter IP:");

    private JTextField ipAdresstxt = new JTextField(10);

    private JButton accept = new JButton("OK");

    private JPanel center = new JPanel();

    private JPanel south = new JPanel();

    private boolean show;

    private Client client;

    private UserInterfaceClient uic;
    
    private StartingFrame sf;

    public StartingFrame() {

        super("Cool Version 1.0 Starting Frame");
        actionHandler();

        this.setLayout(new BorderLayout());
        this.setSize(200, 200);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        center.setLayout(new GridLayout(2, 2));

        center.add(username);
        center.add(usertxt);
        center.add(ipAdress);
        center.add(ipAdresstxt);

        south.add(accept);

        this.add(center);
        this.add(BorderLayout.SOUTH, south);

        this.pack();
        show = true;
        this.setVisible(show);
    }

    private void actionHandler() {

        accept.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent evt) {
                show = false;
                setVisible(show);

                if (!usertxt.getText().isEmpty()
                    && !ipAdresstxt.getText().isEmpty()) {
                    uic =
                        new UserInterfaceClient(usertxt.getText(), ipAdresstxt
                            .getText());
                    uic.setVisible(true);
                    

                    client = new Client(ipAdresstxt.getText(), uic, sf);

                    Thread clientThread = new Thread(client);
                    clientThread.start();

                } else {
                    JOptionPane.showMessageDialog(null, "Ungültige Eingabe!");
                }

            }
        });

        usertxt.addKeyListener(new MyKeyListener());
        ipAdresstxt.addKeyListener(new MyKeyListener());

    }

    public String getUsertxt() {
        return usertxt.getText();
    }

    public String getIpAdresstxt() {
        return ipAdresstxt.getText();
    }

    class MyKeyListener implements KeyListener {

        public void keyPressed(KeyEvent e) {
            int key = e.getKeyCode();

            if (key == KeyEvent.VK_ENTER) {
                if (!usertxt.getText().isEmpty()
                    && !ipAdresstxt.getText().isEmpty()) {
                    show = false;
                    setVisible(show);
                    uic =
                        new UserInterfaceClient(usertxt.getText(),
                            ipAdresstxt.getText());
                    uic.setVisible(true);


                    client = new Client(ipAdresstxt.getText(), uic, sf);

                    Thread clientThread = new Thread(client);
                    clientThread.start();

                } else {
                    JOptionPane.showMessageDialog(null, "Ungültige Eingabe!");
                }
            }

        }

        public void keyReleased(KeyEvent e) {

        }

        public void keyTyped(KeyEvent e) {

        }

    }

}
```

Im Grunde gibt der Benutzer (soll ja ein Chatprogramm werden) seinen Nicknamen ein und die IpAdresse, zu der er connecten möchte.

Dann schließt sich das Fenster und ein neues Fenster der Klasse UserInterfaceClient erscheint - da kann dann der User halt seinen Text eintippen, bzw hat halt das Chatfenster vor seinen Augen.

mein getUsertxt() ist zwar in der Klasse StartingFrame drin, ich poste sie hier aber noch einmal gesondert:


```
public String getUsertxt() {
        return usertxt.getText();
    }
```


----------



## VfL_Freak (14. Mrz 2012)

sorry, sah eben folgendes:


> at network.Client.<init>(Client.java:44)



Dann ist "network.Client" wohl die Klasse aus deinem zweiten Post ??
Dann dürfte die NPE dort in Zeile 44 auftreten !

Gruß
Klaus


----------



## Zel2491 (14. Mrz 2012)

Jo^^

Zeile 44 ist:

[java=44]
out.write(this.sf.getUsertxt());
[/code]

nur weiß ich halt nicht, warum da eine NPE auftritt...


----------



## irgendjemand (14. Mrz 2012)

aua ... hier sind wohl noch 2 weitere fehler zu erwähnen

1) I/O-ops NIE im EDT ausführen ... das freezed die GUI
2) <init> verrät das du irgendwas im construtor machst ... solltest du auch ändern weil so die konsistenz des neuen objektes nicht gewährleistet ist ...


----------



## VfL_Freak (14. Mrz 2012)

Moin,

ja, der gesamte Aufbau ist sicherlich suboptimal 

Deine lokale Variable "_private StartingFrame sf"_ nützt Dir hier sicherlich gar nichts! Zum einen wäre sie nicht initialisiert, zum anderen hast Du ja durch den Konstruktor der Klasse schon ein Objekt vom Typ "StartingFrame", das Du halt durchreichen musst, ggf. per _this_ ...

Gruß
Klaus


----------



## Zel2491 (14. Mrz 2012)

Gut...ich hab mir schon gedacht, dass es mit meinem sf zu tun hat - jetzt weiß ich es mit Sicherheit...
Hat jemand eine Idee oder einen Vorschlag, wie es gehen könnte?
Ihr merkt schon, ich stehe ziemlich auf dem Schlauch^^


----------

