NullPointerException i brak połączenia

0

Witam. Gdy uruchomię tą aplikację, prosty komunikator internetowy, i, po wpisaniu IP, kliknę połącz wyświetla się informacja o błędzie i wyrzuca błąd

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at scom.Okno$2.actionPerformed(ScomApp.java:99)
        ...
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Poniżej zamieszczam kod programu.

package scom;



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

public class ScomApp {

    public static void main(String[] args) throws UnknownHostException {
        InetAddress mojeIP= InetAddress.getLocalHost();
        Okno okno = new Okno();
        okno.setSize(350, 440);
        okno.setTitle("Gaduła " + mojeIP);
        okno.setDefaultCloseOperation(3);
        okno.setVisible(true);
    }
}
class Okno extends JFrame implements ActionListener {

    JTextField pole, pole1, pole2, pole3;
    InetAddress addr;
    Socket socket;
    boolean test;
    PrintWriter out;
    JTextArea area, area1, area2, area3;
    JButton przycisk, przycisk2;
    public static final int PORT = 411;
    String ip;
    JLabel stan;
    public Okno() {
        JPanel panel = new JPanel();
        panel.setBackground(new Color(34, 145, 255));
        pole = new JTextField(15);
        
        


        area = new JTextArea(20, 25);

        panel.add(area);
        panel.add(pole);
        final JLabel stan = new JLabel(" STAN:  Rozłączony");
        JButton przycisk = new JButton("Wyślij");
        final JButton przycisk2 = new JButton("Połącz");

        

        przycisk.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                
            }
        });
        przycisk2.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent e) {

                if(przycisk2.getText().equals("Połącz"))
               {
        String ip=pole.getText();
        
               try
                   {
                     addr = InetAddress.getByName(ip);
                     System.out.println("=Lacze sie z komputerem o adresie : " + ip);
                     socket = new Socket(ip, PORT);
                     System.out.println("==Na porcie: " + socket.getPort());
                     test = true;
                     
                   }

                        catch(Exception b)
                        {

                            przycisk2.setEnabled(false);
                            stan.setText(" STAN:  disconnected");
                            System.out.println("Polaczenie jest niemozliwe do zrealizowania ......");
                            test = false;
                        }

                    if (test){

                       przycisk2.setEnabled(true);
                       stan.setText(" STAN:  connected");
                     }


                else{


                     przycisk2.setEnabled(false);
                     stan.setText(" STAN:  disconnected");

                      

                       try{
                           socket.close();


                           }
                           catch(IOException c)
                           {
                             System.out.println("Problem z zamknieciem socketu");
                           }

                }
            }
            }
        });


        panel.add(przycisk);
        panel.add(przycisk2);
        panel.add(stan);
        getContentPane().add(panel);
    }

    public void actionPerformed(ActionEvent e) {

    }



    public class Connection extends Thread
  {



    Connection(Socket s, JTextArea ta)
    {
        socket = s;
        area = ta;
    }

    void addText(String s)
    {
        area.setText(s + "\n" + pole.getText());
        java.awt.Toolkit.getDefaultToolkit().beep();
    }

    public void run()
    {
         try
         {
             try
             {

                  BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                  PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);


                  while (true)
                  {
                      String str = in.readLine();

                          try {
                              if ( str.equals("END"))
                              {
                                 System.out.println(" Nadeszlo polecenie zamkniecia połączenia !");
                                 break;
                              }

                              this.addText("------------------------------");
                              this.addText(socket.getInetAddress() + " : " + str);


                         }

                         catch(NullPointerException e)
                         {
                          ;
                         }
                 }
             }

             finally
             {

                System.out.println("Połączenie zostało przerwane ....");
                socket.close();
             }
          }
          catch(IOException e)
          {


                            przycisk2.setEnabled(false);
                            stan.setText(" STAN:  disconnected");
          }

    }
  }
    public class Server extends Thread
  {

    boolean working = true;
    Server(JTextArea ta)
    {
        area = ta;
    }

    void addText(String s)
    {
        area.setText(s + "\n" + pole.getText());
    }

    public void end()
    {
        working = false;
    }

    public void run()
    {
         while(working)
         {
             try
             {
                ServerSocket s = new ServerSocket(PORT);

                     try
                     {
                         System.out.println("Oczekuje na rozmowe ...");
                         Socket socket = s.accept();


                         Connection c = new Connection(socket, area);
                         c.start();
                         System.out.println("Rozmowa przyjeta - trwa !  port: " + socket.getPort());
                     }

                     catch(Exception e)  //IO
                     {
                         System.out.println("Blad programu: problem z przyjeciem polaczenia");
                     }


             }
             catch(IOException e)
             {
               ;
             }
         }

    }
  }
    private void sendInformation()
    {

            try
            {

                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                out.println(pole.getText());


                area.setText("------------------------------" + "\n" + pole.getText());
                area.setText("Ja:" + pole.getText() + "\n" + pole.getText());

            }

            catch(IOException e)
            {
            System.out.println("Problem z wyslaniem informacji ...");
            System.out.println(e);
            }

    }

    
}

0

zmienną socket inicjujesz w bloku try, a następnie próbujesz wywołać metodę close() poza tym blokiem. Jeżeli w bloku try nastapi błąd to JVM zrobi "rollback" pamięci i zmienna socket będzie niezainicjowana. Zatem musisz sprawdzić czy socket nie jest nullem.

Swoją drogą wywaliłeś najważniejszą część stacktrace.

0

To może być dziwne pytanie, ale jak mam to zrobić?
PS. Cały stacktrace

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at scom.Okno$2.actionPerformed(ScomApp.java:101)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3255)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2475)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
0
if(socket != null){
socket.close();
}
0

Owszem, teraz nie wyrzuca mi błędu, ale ciągle nie mogę się połączyć ze sobą ani z drugim komputerem.

EDIT: Naprawiłem! Zapomniałem po prostu o zainicjowaniu serwera.

0

Za linijka System.out.println("Polaczenie jest niemozliwe do zrealizowania ......"); dodaj exc.printStackTrace() gdzie exc to naza zmiennej błędu z bloku catch. Zobacz co jest przyczyną błędu.

0

Aplikacja działa, ale nie mogę się połączyć z komputerem stojącym obok. Oba są w tej samej sieci, połączone przez ten sam ruter, mają IP z końcówką 100 i 101. Dodam, że drugi komputer to laptop łączy się przez Wi-Fi. Co może powodować ten problem?

0

A co się pojawia na konsoli?

                        catch(Exception b)
                        {
                            przycisk2.setEnabled(false);
                            stan.setText(" STAN:  disconnected");
                            //System.out.println("Polaczenie jest niemozliwe do zrealizowania ......"); 
                            System.out.println(b);
                            test = false;
                        }

Obsługa błędu

System.out.println("Polaczenie jest niemozliwe do zrealizowania ......");

jest, imho, bezsensowna. Taki komunikat, to możesz wyświetlić użytkownikowi w jakimś komponencie graficznym.

0

Właśnie na konsoli nie pojawia się nic oprócz

=Lacze sie z komputerem o adresie : 192.168.1.101
Oczekuje na rozmowe ...
Polaczenie jest nie mozliwe do zrealizowania ......

a za drugim razem nawet bez oczekuje na rozmowę, a to "polaczenie jest nie mozliwe do zrealizowania" jest niewidoczne dla użytkownika.

0

Wpierw napisał @Koziołek, potem ja dałem przykład kodu, ZMIEŃ obsługę błędu.

0

Chyba nie zrozumiałeś moich uwag o obsłudze błędów. Komunikat

polaczenie jest niemozliwe do zrealizowania
można wyświetlić użytkownikowi. Jest on natomiast całkowicie nieprzydatny dla programisty. Minimum informacji, którą powinieneś wyświetlić sobie, to

System.out.println(e); //e oznacza Exception
0

Dzięki za odpowiedź. Już zmienione, ale dlaczego nie mogę połączyć się z drugim komputerem??

0

A daj ten stacktrace, bo z fusów to my wróżyć nie potrafimy (jeszcze).

0

To musiało być coś z ruterem, bo się samo naprawiło. Ale czy ktoś z was wie jak dodać do programu protokół Gadu-Gadu??

0

jest odpowiednia biblioteka
http://jggapi.sourceforge.net/

1 użytkowników online, w tym zalogowanych: 0, gości: 1