NullPointerException в методе выполнения потока - PullRequest
0 голосов
/ 30 сентября 2011

Я был бы очень признателен за помощь с моей программой.Это своего рода чат-сервер с несколькими клиентами.Вот код сервера:

package com.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
    public static int PORT;
    private ServerSocket server;
    private Socket socket;

    public Server(int port) throws IOException {
        PORT = port;
        server = new ServerSocket(PORT);
        System.out.println("server started");
        try {
            while (true) {
                socket = server.accept();
                try {
                    new ServeClient(socket);
                } catch (IOException e) {
                    socket.close();
                }
            }
        } finally {
            server.close();
        }

    }

    public static void main(String[] args) throws IOException {
        int port = Integer.parseInt(args[0]);
        Server server = new Server(port);
    }

}

Я запускаю сервер, а затем создаю Клиент.Сервер получает сокет подключения от сокета и создает поток ServeClient.Вот код ServeClient:

package com.server;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Enumeration;
import java.util.Vector;

import com.gui.WindowManager;

public class ServeClient extends Thread {
    private final Socket socket;
    private BufferedReader in;
    private PrintWriter out;
    private String msg;
    public static final String ENDSTRING = "END";
    public static Vector clients = new Vector();

    public ServeClient(final Socket socket) throws IOException {
        this.socket = socket;
        System.out.println("socket " + socket);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
                socket.getOutputStream())), true);
        start();
    }

    public void run() {
        try {
            clients.add(this);
            while (true) {
                msg = in.readLine();
                if (msg == ENDSTRING)
                    break;
                broadcast(msg);
            }
            System.out.println("closing...");
        } catch (IOException e) {
            System.err.println("IO EXCEPTION");
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                System.err.println("SOCKET NOT CLOSED");
            }
        }
    }

    @SuppressWarnings("deprecation")
    public void broadcast(String msg) {
        synchronized (clients) {
            Enumeration<ServeClient> e = clients.elements();
            while (e.hasMoreElements()) {
                ServeClient serveClient = e.nextElement();
                try {
                    synchronized (serveClient.out) {
                        serveClient.out.println(msg);
                    }
                } catch (Exception eee) {
                    serveClient.stop();
                }
            }
        }
    }
}

Я получаю исключение NullPointerException, когда ServeClient вызывает метод run ()) метод

Ответы [ 4 ]

2 голосов
/ 30 сентября 2011
com.server.ServeClient.run(ServeClient.java:33)

Я не верю, что это происходит при попытке.

Откройте IDE, включите отладку и переходите, пока не увидите, что происходит.Это самый быстрый способ выяснить, что вы пропустили.

Есть объект, который, как вы полагаете, хорош, но это не так.Найдите его.

Вот пример того, как сделать это правильно:

http://www.kodejava.org/examples/216.html

1 голос
/ 22 октября 2013

Извините за устранение такой старой проблемы, но казалось, что эта проблема не решена, поэтому я приведу немного информации с моей стороны.

У меня была похожая проблема, и компилятор также говорил мне, что проблема была в методе start (). Однако, когда я закомментировал часть потока и просто запустил код в том же потоке, что и пользовательский интерфейс, компилятор указал мне на реальный источник проблемы: код внутри потока.

Убедившись, что код не выдал ошибку, я вложил код в исходный код потока, и он перестал выдавать мне ошибку NullPointerException.

Надеюсь, это поможет кому-то на этом пути.

1 голос
/ 30 сентября 2011

Ваша проблема с порядком, в котором инициализируются статические переменные экземпляра.Попробуйте сделать что-то вроде:

...
private static Vector clients = null;
...
if (clients==null) {
    clients = new Vector(); // consider putting this in a synchronized block
}

, прежде чем добавить клиента в вектор.

0 голосов
/ 26 июля 2015

Удалите дублирующее объявление класса в JPanel.

Я пытался запустить поток таймера, который обновлял часы в главном окне приложения.

Я создал JFrame с Eclipse / WindowBuilderи следовал учебнику о том, как сделать таймер.Я скопировал объявление текстового поля в объявление класса, чтобы сделать его доступным для всего класса, но забыл удалить идентификатор класса перед определением виджета.Таким образом, он все еще инициализировал локальный экземпляр, а не глобальный.Таким образом, когда я получил доступ к глобальному, он все еще был нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...