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 tema
Cloud & AI
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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