Avatar billede christofferhp Nybegynder
09. august 2007 - 21:11 Der er 17 kommentarer og
1 løsning

NullPointerException! Objekter kan ikke findes inde i actionPe -

Hej alle.

Jeg har en multitrådet server, dens formål er ligegyldigt i denne sammenhæng.

Jeg opretter i hver tråd et panel som vises i GUI delen af serveren. I denne GUI er der en knap som skal kunne disconnecte klienten ved at sende en besked og samtidigt lukke input- og outputstreams samt trådens socket og selve tråden.

PrintWriter kltOut = null;
BufferedReader kltIn = null;;
Socket _kltSocket = null;;

...

ServerMTO(Socket kltSocket) {
_kltSocket = kltSocket;

...

Disconnect.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent aEvent) {
  try {
  kltOut.println("DCT 100");
  kltIn.close();
  kltOut.close();
  _kltSocket.close();
  } catch (IOException IOException) {
  System.out.println(".");
  } catch (NullPointerException NullPointerException) {
  NullPointerException.printStackTrace();
  }
}
});

...

DataInputStream kltIn = new DataInputStream(_kltSocket.getInputStream());
PrintStream kltOut = new PrintStream(_kltSocket.getOutputStream());

De tre punktummer svarer til de stykker af koden som er uvæsentlig.

Hvorfor kan jeg ikke kalde de objekter inde i min actionPerformed?
Avatar billede winners79 Nybegynder
09. august 2007 - 21:18 #1
hvilken linie giver en null pointer exception?
Avatar billede christofferhp Nybegynder
09. august 2007 - 21:21 #2
det er linjen med:

kltOut.println("DCT 100");

mens hvis jeg fjerner den.. så er det bare den næste "kltIn.close();" som giver exception.

og det samme med "kltOut.close();"

dog hvis jeg bare lukker socketet så får jeg en IOException og socketet bliver også lukket.
Avatar billede nielle Nybegynder
09. august 2007 - 21:24 #3
Har du initialiseret den variabel noget sted? Det eneste der står i koden er jo:

PrintWriter kltOut = null;

som passer meget godt med en null-pointer exception. Ligeledes med kltIn.
Avatar billede christofferhp Nybegynder
09. august 2007 - 21:27 #4
Nu får i sku lige hele koden. Så er det lidt nemmere.

import java.net.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ServerMTO implements Runnable {
   
    PrintWriter kltOut = null;
    BufferedReader kltIn = null;;
    Socket _kltSocket = null;;
    String inputLine, outputLine;

    ServerMTO(Socket kltSocket) {
        _kltSocket = kltSocket;

        JPanel Panel = new JPanel(new GridBagLayout());
        GridBagConstraints Constraints = new GridBagConstraints();
        Panel.add(new JLabel(_kltSocket.toString()), Constraints);

        JButton Disconnect = new JButton("Disconnect");
        Disconnect.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent aEvent) {
                try {
                    kltOut.println("DCT 100");
                    kltIn.close();
                    kltOut.close();
                    _kltSocket.close();
                } catch (IOException IOException) {
                    System.out.println(".");
                } catch (NullPointerException NullPointerException) {
                    NullPointerException.printStackTrace();
                }
            }
        });
        Panel.add(Disconnect);

        ServerGUI.TabbedPanel.addTab(_kltSocket.getInetAddress().toString(), Panel);
    }

    public void run() {
        try {
            DataInputStream kltIn = new DataInputStream (_kltSocket.getInputStream());
            PrintStream kltOut = new PrintStream(_kltSocket.getOutputStream());

            while ((inputLine = kltIn.readLine()) != null) {
                System.out.println(inputLine);
                kltOut.println(inputLine);
            }

        } catch (IOException IOException) {
            System.out.println(".");
        }
    }
}

Som du kan se så er de initialiseret inde i run(), mener jeg da ;)
Avatar billede nielle Nybegynder
09. august 2007 - 21:32 #5
Nej, det gør de ikke. Du har der linjen:

PrintStream kltOut = new PrintStream(_kltSocket.getOutputStream());

hvilket betyder at du opretter en ny lokal variabel med samme navn der. Det er den som bliver initialiseret.

Ret:

PrintStream kltOut = new PrintStream(_kltSocket.getOutputStream());

til:

kltOut = new PrintStream(_kltSocket.getOutputStream());
Avatar billede christofferhp Nybegynder
09. august 2007 - 21:34 #6
OMG!

Jeg ændrede jo lige stil fra PrintWriter til PrintStream mens jeg lavede serveren :P

Så er der sku lige glippet lidt.

Det ser ud til at virke nu. Fix et svar så får du da lige nogle point.
Avatar billede nielle Nybegynder
09. august 2007 - 21:36 #7
Men mon ikke den også fejler efter som at _kltSocket er null når run() kaldes?
Avatar billede nielle Nybegynder
09. august 2007 - 21:37 #8
Svar :^)
Avatar billede christofferhp Nybegynder
09. august 2007 - 21:40 #9
Nielle,

I min class constructor bliver den initialiseret

ServerMTO(Socket kltSocket) {
    _kltSocket = kltSocket;

...

}
Avatar billede christofferhp Nybegynder
09. august 2007 - 21:41 #10
Det er jo et thread system, som bliver kaldt af:

new Thread(new ServerMTO(kltSocket)).start();
Avatar billede nielle Nybegynder
09. august 2007 - 21:43 #11
Ja du har fuldstændig ret. Den kortsluttede bare et øjeblik, og du behøver ikke at forklare yderligt. :^)
Avatar billede christofferhp Nybegynder
09. august 2007 - 21:44 #12
Tjah det med kortslutning kender jeg i hvert fald godt til ;)
Avatar billede nielle Nybegynder
09. august 2007 - 21:46 #13
Jeg vil anbefale at du ikke navngiver dine exeception-klasser efter klassen selv:

...
} catch (IOException IOException) {
  System.out.println(".");
  } catch (NullPointerException NullPointerException) {
  NullPointerException.printStackTrace();
...

til:

...
} catch (IOException ex) {
  System.out.println(".");
  } catch (NullPointerException ex) {
  ex.printStackTrace();
...
Avatar billede christofferhp Nybegynder
09. august 2007 - 21:49 #14
Nogen speciel grund?
Avatar billede nielle Nybegynder
09. august 2007 - 21:53 #15
1) Lettere at læse din kode -> letter at vedligeholde den.

2) Iøvrigt resikere du problemer med sådan noget som:

NullPointerException.printStackTrace();

for er det selve klassen NullPointerException eller er det instansen af den (astså din exception) der refereres til?
Avatar billede nielle Nybegynder
09. august 2007 - 21:55 #16
3) Jeg er lidt forbavset over at det overhovedet kompilere. Men hvis du nogensinde skulle vælge at skifte til et andet sprog, f.eks. C#, så vil det ikke virke der. Så hvorfor vende sig til den slags, når det kan give problemer senere?
Avatar billede christofferhped Nybegynder
09. august 2007 - 22:04 #17
Meget god pointe ;)

Har skam også ændret det allerede.

Endnu engang tak for hjælpen.
Avatar billede nielle Nybegynder
09. august 2007 - 22:16 #18
You're welcome :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester