Komunikator Gaduła i java.lang.NullPointerException

0

Witam!

Mam następujący problem. Gdy próbuje się połączyć z komputerem stojącym metr obok, wyrzucam mi java.lang.NullPointerException. Dodam, że korzystam z możliwości tworzenia interfejsu w NetBeans i gdy korzystałem z komunikatora z tym samym kodem, ale ręcznie robionym interfejsem ten błąd też wystepował, ale rzadziej i gdy łączę się sam ze sobą to wszystko działa. Załączam stacktrace:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at gaduła.GadułaView.sendInformation(GadułaView.java:324)
        at gaduła.GadułaView.wyslij(GadułaView.java:363)
        at gaduła.GadułaView.access$200(GadułaView.java:13)
        at gaduła.GadułaView$2.actionPerformed(GadułaView.java:223)
        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)

i kod aplikacji.



package gaduła;

import org.jdesktop.application.Action;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import java.io.*;
import java.net.*;
import javax.swing.*;


public class GadułaView extends FrameView {
boolean working = true;

public class Connection extends Thread{


Socket socket;
    JTextArea area;

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

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

        @Override
    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(socket.getInetAddress() + " : " + str);


                         }

                         catch(NullPointerException e)
                         {
                          out.print(e);
                         }
                 }
             }

             finally
             {

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

                            przycisk2.setEnabled(false);
                            
          }

    }




}

public class Server extends Thread
  {
    public static final int PORT = 80;
    boolean working = true;
    JTextArea area;
    Server(JTextArea ta)
    {
        area = ta;
    }

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

    public void end()
    {
        working = false;
    }


        @Override
    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
                     {
                         
                     }


             }
             catch(IOException e)
             {
               
             }
         }

    }
  }
    InetAddress addr;
    Socket socket;
    boolean test;
    PrintWriter out;
    public static final int PORT = 80;
    String ip;
    
    Server server;

    public GadułaView(SingleFrameApplication app) {
        super(app);

        initComponents();

       
    }

    @Action
    public void showAboutBox() {
        if (aboutBox == null) {
            JFrame mainFrame = GadułaApp.getApplication().getMainFrame();
            aboutBox = new GadułaAboutBox(mainFrame);
            aboutBox.setLocationRelativeTo(mainFrame);
        }
        GadułaApp.getApplication().show(aboutBox);
    }

   
    @SuppressWarnings("unchecked")

KOD WYGENEROWANY PRZEZ NETBEANS

    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        mainPanel = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        area = new javax.swing.JTextArea();
        jScrollPane2 = new javax.swing.JScrollPane();
        jList1 = new javax.swing.JList();
        pole = new javax.swing.JTextField();
        przycisk3 = new javax.swing.JButton();
        przycisk = new javax.swing.JButton();
        przycisk2 = new javax.swing.JButton();
        menuBar = new javax.swing.JMenuBar();
        javax.swing.JMenu fileMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
        javax.swing.JMenu helpMenu = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();

        mainPanel.setName("mainPanel"); // NOI18N

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        area.setColumns(20);
        area.setRows(5);
        area.setName("area"); // NOI18N
        jScrollPane1.setViewportView(area);
        area.setEditable(false);

        jScrollPane2.setName("jScrollPane2"); // NOI18N

        jList1.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Kontakty (Jeszcze nie działa!!" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        jList1.setName("jList1"); // NOI18N
        jScrollPane2.setViewportView(jList1);

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(gaduła.GadułaApp.class).getContext().getResourceMap(GadułaView.class);
        pole.setText(resourceMap.getString("pole.text")); // NOI18N
        pole.setName("pole"); // NOI18N

        przycisk3.setText(resourceMap.getString("przycisk3.text")); // NOI18N
        przycisk3.setName("przycisk3"); // NOI18N
        przycisk3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                wyslij(evt);
            }
        });

        przycisk.setText(resourceMap.getString("przycisk.text")); // NOI18N
        przycisk.setName("przycisk"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(gaduła.GadułaApp.class).getContext().getActionMap(GadułaView.class, this);
        przycisk2.setAction(actionMap.get("sendInformation")); // NOI18N
        przycisk2.setText(resourceMap.getString("przycisk2.text")); // NOI18N
        przycisk2.setName("przycisk2"); // NOI18N
        przycisk2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                polacz(evt);
            }
        });

        javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
        mainPanel.setLayout(mainPanelLayout);
        mainPanelLayout.setHorizontalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(mainPanelLayout.createSequentialGroup()
                        .addContainerGap()
                        .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(pole, javax.swing.GroupLayout.DEFAULT_SIZE, 285, Short.MAX_VALUE)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 285, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(3, 3, 3))
                    .addGroup(mainPanelLayout.createSequentialGroup()
                        .addGap(36, 36, 36)
                        .addComponent(przycisk3, javax.swing.GroupLayout.PREFERRED_SIZE, 80, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(przycisk2)
                        .addGap(18, 18, 18)
                        .addComponent(przycisk, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );

        mainPanelLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {przycisk, przycisk2, przycisk3});

        mainPanelLayout.setVerticalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addGap(5, 5, 5)
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(mainPanelLayout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 188, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(pole, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jScrollPane2))
                .addGap(11, 11, 11)
                .addGroup(mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(przycisk2)
                    .addComponent(przycisk)
                    .addComponent(przycisk3))
                .addGap(92, 92, 92))
        );

        menuBar.setName("menuBar"); // NOI18N

        fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
        fileMenu.setName("fileMenu"); // NOI18N

        exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
        exitMenuItem.setText(resourceMap.getString("exitMenuItem.text")); // NOI18N
        exitMenuItem.setName("exitMenuItem"); // NOI18N
        fileMenu.add(exitMenuItem);

        menuBar.add(fileMenu);

        helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
        helpMenu.setName("helpMenu"); // NOI18N

        jMenuItem1.setText(resourceMap.getString("jMenuItem1.text")); // NOI18N
        jMenuItem1.setName("jMenuItem1"); // NOI18N
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                www(evt);
            }
        });
        helpMenu.add(jMenuItem1);

        aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
        aboutMenuItem.setText(resourceMap.getString("aboutMenuItem.text")); // NOI18N
        aboutMenuItem.setName("aboutMenuItem"); // NOI18N
        helpMenu.add(aboutMenuItem);

        menuBar.add(helpMenu);

        setComponent(mainPanel);
        setMenuBar(menuBar);
    }// </editor-fold>

KONIEC KODU WYGENEROWANEGO

 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());
                if(in == null){System.out.print("in is null"); }


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

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

    }

    private void www(java.awt.event.ActionEvent evt) {                     
if (java.awt.Desktop.isDesktopSupported()) {
	java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
	if (desktop.isSupported(java.awt.Desktop.Action.BROWSE)) {
		try {
			desktop.browse(new URI("http://www.szymekdo.cba.pl"));
		}
		catch (IOException e) {
			System.out.println(e);
		}
		catch (URISyntaxException e) {
System.out.println(e);
		}
	}
}
else {
//        // TODO add your handling code here:
    }                    
    }
private void wyslij(java.awt.event.ActionEvent evt) {                        

    sendInformation();
}                       

private void polacz(java.awt.event.ActionEvent evt) {
    String ip=pole.getText();
                if(przycisk2.getText().equals("Połącz"))
               {
       server = new Server(area);
                    server.start();

               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 e)
                        {

                            przycisk2.setEnabled(true);
                            
                            System.out.println(e);


                            test = false;
                        }

                    if (test){
                       przycisk.setEnabled(true);
                       przycisk2.setEnabled(false);
                       
                       area.setText("");
                       
                     }


                else{





                     

                      if(socket != null){
                            try {
                                socket.close();
                            } catch (IOException ex) {
                                System.out.print("Problem z zamknieciem socketu");
                                System.out.println(ex);
                            }
}



            }}
}




    // Variables declaration - do not modify
    private javax.swing.JTextArea area;
    private javax.swing.JList jList1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JPanel mainPanel;
    private javax.swing.JMenuBar menuBar;
    private javax.swing.JTextField pole;
    private javax.swing.JButton przycisk;
    private javax.swing.JButton przycisk2;
    private javax.swing.JButton przycisk3;
    // End of variables declaration

    

    private JDialog aboutBox;
}
0

Przypuszczam, ze chodzi o te linie:

private void sendInformation() {
   try {
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      //...
}

A dokladniej socket.getInputStream() zwraca nulla. Twoja aplikacja jest jednoczesnie klientem i serwerem. Oba sockety (serwer i klient) otwieraja sie w tym samym momencie (akcja na przycisk2, metoda private void polacz()). Istnieje mozliwosc, ze klient drugiej aplikacji sprobuje nawiazac polaczenie zanim serwer pierwszej aplikacji bedzie nasluchiwal na danym porcie. Nie ma problemu, gdy laczysz sie ze soba (ta sama aplikacja), bo serwer uruchamiany jest pierwszy.

Poza tym:

//...
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

Nie ma potrzeby robienia czegosc takiego. PrintWriter sam sobie opakuje strumien w BufferedWriter jesli uzyjesz konstruktora PrintWriter(OutputStream out).

private void sendInformation() {
   try {
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      //...
      if(in == null){ System.out.print("in is null"); }
      //...
}

Ten if() tez nie ma sensu, bo jesli juz dojdzie do jego sprawdzenia, zawsze zwroci false

Poza tym, nie kazdy OS pozwoli Ci uruchomic serwer na porcie ponizej 1024 (tutaj: 80), bez dodatkowych uprawnien.

0

Proponuję na pewno zacząć od zmiany portu, najlepiej na coś powyżej 3000.

Poza tym dlaczego się tak męczysz:

if(in == null){ System.out.print("in is null"); }

Korzystasz z IDE, więc czemu nie używasz debuggera?

0

If-a wywaliłem, ale jak mam użyć tego konstruktora i jak zrobić, żeby serwer zawsze uruchamiał się pierwszy?

0

Optymalnym rozwiazaniem byloby w ogole wyrzucenie serwera do osobnej aplikacji (daemona?) i stworzenie prostego mechanizmu identyfikacji nadawcow/odbiorcow oraz wysylania komunikatow.

Natomiast w obecnym kodzie, przede wszystkim, musisz rozdzielic uruchamianie serwera i klienta do osobnych metod. Metode startujaca serwer mozesz wywolac zaraz po uruchomieniu aplikacji, a metode uruchamiajaca klienta po kliknieciu przycisku "Polacz".

PS: zwroc uwage, ze Twoj kod w chwili obecnej moze otrzymywac komunikaty z wielu klientow, ale wysylac tylko do jednego.

Poza tym, przejrzyj jeszcze raz caly kod, bo jest tam jeszcze pare niedociagniec, jak np.:

private void polacz(java.awt.event.ActionEvent evt) {
    //...
    if(przycisk2.getText().equals("Połącz")) {
    }
    //...
}
0

Zmieniłem kod, serwer jest w oddzielnej klasie, ale teraz wyrzuca mi coś takiego:

java.net.ConnectException: Connection timed out: connect

a gdy zmienie port na inny niz 80

java.net.ConnectException: Connection refused: connect

Co z tym zrobić??

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