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?
Annonceindlæg fra Novataris
09. august 2007 - 21:18
#1
hvilken linie giver en null pointer exception?
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.
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.
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 ;)
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());
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.
09. august 2007 - 21:36
#7
Men mon ikke den også fejler efter som at _kltSocket er null når run() kaldes?
09. august 2007 - 21:37
#8
Svar :^)
09. august 2007 - 21:40
#9
Nielle, I min class constructor bliver den initialiseret ServerMTO(Socket kltSocket) { _kltSocket = kltSocket; ... }
09. august 2007 - 21:41
#10
Det er jo et thread system, som bliver kaldt af: new Thread(new ServerMTO(kltSocket)).start();
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. :^)
09. august 2007 - 21:44
#12
Tjah det med kortslutning kender jeg i hvert fald godt til ;)
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(); ...
09. august 2007 - 21:49
#14
Nogen speciel grund?
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?
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?
09. august 2007 - 22:04
#17
Meget god pointe ;) Har skam også ændret det allerede. Endnu engang tak for hjælpen.
09. august 2007 - 22:16
#18
You're welcome :^)
Kurser inden for grundlæggende programmering