Kilkukrotne naciścięcie przycisku gdy nie ma żadnej wiadomości zawiesza program - dlaczego?

0
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package klient2_gui;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Jakub
 */
public class Okienko extends javax.swing.JFrame {

    public String message;
    public final DatagramSocket receivingSocket;
    byte[] server = new byte[]{(byte) 169, (byte) 254, (byte) 203, (byte) 150};

    byte[] bufWysylany;
    byte[] bufOdbierany;

    public Okienko() throws SocketException {
        this.receivingSocket = new DatagramSocket(5556);
        initComponents();
    }

private void initComponents() {
	//usunąłem, bo zajmowało bardzo dużo miejsca
}

    private void sendButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
        message = getTheText.getText();
        bufWysylany = new byte[message.length()];
        DatagramPacket packet = new DatagramPacket(bufWysylany, bufWysylany.length);

        //displayText.setText(getTheText.getText() + "\n");
        // String text = message.nextLine();
        byte[] buffer = message.getBytes();
        try {
            InetAddress serverAdress = InetAddress.getByAddress(server);
            DatagramSocket socket = new DatagramSocket();
            socket.send(new DatagramPacket(buffer, buffer.length, serverAdress, 5555));
        } catch (IOException e) {
            System.err.println("e");
        }
    }                                          

    private void getTheTextActionPerformed(java.awt.event.ActionEvent evt) {                                           
        getTheText.getText();
    }                                          

    private void receiveTextActionPerformed(java.awt.event.ActionEvent evt) {                                            
        odbieranie();
    }                                           

    private void extiButtomActionPerformed(java.awt.event.ActionEvent evt) {                                           
        System.exit(0);
     }                                          

    public void odbieranie() {
        try {
            bufOdbierany = new byte[50];
            DatagramPacket packet = new DatagramPacket(bufOdbierany, bufOdbierany.length);

            receivingSocket.receive(packet);
            String response = new String(packet.getData(), 0, packet.getLength(), "UTF-8");
            displayText.setText(response);
        } catch (IOException e) {
            System.exit(0);
            System.err.println("e");
        }
    }

   
    public static void main(String args[]) {
       
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {

                    new Okienko().setVisible(true);
                } catch (SocketException ex) {
                    Logger.getLogger(Okienko.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }

    // Variables declaration - do not modify                     
    public javax.swing.JTextArea displayText;
    private javax.swing.JButton extiButtom;
    public javax.swing.JTextField getTheText;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JButton receiveText;
    public javax.swing.JButton sendButton;
    // End of variables declaration                   
}

Metoda ** odbieranie()** , która ma zadanie odbierać dane klasy DatagramPacket od drugiego klienta poprzez serwer i konwertuje je na String i wyświetla w jTextArea.

Jest ona wywoływana w receiveTextActionPerformed, a w GUI poprzez konkretny przycisk.
Jak nietrudno się domyślić każde naciśnięcie powoduje wyświetlenie nadesłanej wiadomości.
I tu mam problem. Naciśnięcie kilkakrotnie przycisku, w sytuacji kiedy nie ma żadnej wiadomości powoduje zawieszenie programu.

Z czego to może wynikać?

wstawienie kodu do treści posta - @furious programming

1

user image

0

@datdata Skąd mam je wziać?

1

Dobrą praktyką jest używanie jakiegoś mechanizmu logowania, żeby w razie jakichś dziwnych problemów móc na ich podstawie stwierdzić co jest nie tak, bo czasami szukanie błędu bez nich jest bardzo trudne lub niemożliwe (przy większych systemach). Możesz użyć standardowe loggera z biblioteki javy lub np. poczytać o log4j czy jeszcze innych rozwiązaniach (opcji jest sporo).

0

@datdata Dziękuję za wskazówkę. :) Jak będę coś więcej wiedział, to napiszę.

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