почему он возвращает исключение нулевого указателя (на стороне сервера) - PullRequest
0 голосов
/ 18 января 2010

это мой класс сервера, который позволяет клиентам общаться друг с другом, но он выдаст исключение nullpointer для этой строки: while (!(line = in.readLine()).equalsIgnoreCase("/quit")) не могли бы вы мне помочь? Спасибо.

мой класс ChatHandler:

 final static Vector handlers = new Vector(10);
private Socket socket;
private BufferedReader in;
private PrintWriter out;

public ChatHandler(Socket socket) throws IOException {
    this.socket = socket;
    in = new BufferedReader(
            new InputStreamReader(socket.getInputStream()));
    out = new PrintWriter(
            new OutputStreamWriter(socket.getOutputStream()));
}

@Override
public void run() {
    String line;

    synchronized (handlers) {
        handlers.addElement(this);
    // add() not found in Vector class
    }
    try {
        while (!(line = in.readLine()).equalsIgnoreCase("/quit")) {
            for (int i = 0; i < handlers.size(); i++) {
                synchronized (handlers) {
                    ChatHandler handler =
                            (ChatHandler) handlers.elementAt(i);
                    handler.out.println(line + "\r");
                    handler.out.flush();
                }
            }
        }
    } catch (IOException ioe) {
        ioe.printStackTrace();
    } finally {
        try {
            in.close();
            out.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            synchronized (handlers) {
                handlers.removeElement(this);
            }
        }
    }
}

часть клиентского класса:

  String teXt = MainClient.getText();

    os.println(teXt);
    os.flush();
    try {
        String line = is.readLine();



            setFromServertext("Text recieved:"+line+"\n");

        is.close();
        is.close();
        c.close();
    } catch (IOException ex) {
        Logger.getLogger(MainClient.class.getName()).log(Level.SEVERE, null, ex);
    }

Ответы [ 2 ]

3 голосов
/ 18 января 2010

Это неправильная идиома. BufferedReader#readLine() вернет null при достижении конца потока.

Таким образом, необходимо заменить следующее

while (!(line = in.readLine()).equalsIgnoreCase("/quit")) {
    // Do stuff.
}

от:

while ((line = in.readLine()) != null && !line.equalsIgnoreCase("/quit")) {
    // Do stuff.
}

Также см. собственные базовые учебные руководства Sun по Java IO по использованию BufferedReader: http://java.sun.com/docs/books/tutorial/essential/io/

2 голосов
/ 18 января 2010

in.readLine() вернет null, когда больше нечего читать.Вам нужно изменить это на

String line;
while ((line = in.readLine()) != null) {
    if (!line.equalsIgnoreCase("/quit")) {

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