Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Исключение NullPointerException


Автор: freeKODE 18.11.2011, 23:27
Вот такой код. Сразу после подключения клиента вылетает исключение NullPointerException ругаясь на 23 строку. Убираем первый блок try-finally (комментируем строки 23-32). Все ок никакого исключения не вылетает. Как его избежать-то? Если мне нужен первый блок try-finally
Код

import java.io.*;
import java.net.*;

class IncomingClients extends Thread { //треды для присоединенных клиентов
    private Socket socket;
    private BufferedReader in;
    private PrintWriter out;
    
    public IncomingClients(Socket s) throws IOException {
        socket = s;
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
        //StrIn = in.readLine(); //входящий поток в строковую, тк требует у класса обработки исключения IOException

        InetAddress socketAddress = socket.getInetAddress(); //будет вариант в одну строку, пиши
        String hostIncoming = socketAddress.getHostName();

        System.out.println("Client host: " + hostIncoming);
        start();
    }
    public void run() { //цикл приема сообщений, на данный момент будет отвечать зеркально клиенту
        try {
            while (true) {
                String strIn = in.readLine();
                System.out.println(strIn);
            }
        }
        catch (IOException e) {
            System.out.println("IO Exception");
        }
        finally {
            try {
                socket.close();
            }
            catch (IOException e) {
                System.err.println("error close");
            }
        }
        //String strIn = in.readLine();
        //System.out.println(strIn);
    }
}

public class Srv {
    public static final int PORT = 8383;
    
    public static void main (String[] args) throws IOException {
        ServerSocket srvSocket = new ServerSocket(PORT);
        System.out.println("Start " + srvSocket);
        try {
            while (true) { //бесконечно ждем клиентов
                Socket cltSocket = srvSocket.accept();
                System.out.println("connect " + cltSocket);
                new IncomingClients(cltSocket);
            }
        }
        finally {
            System.out.println("close");
            srvSocket.close();
        }
    }
}

Автор: AlexeyVorotnikov 21.11.2011, 11:33
Строчки 11 и 12 должны выглядеть вот так:
Код

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

Автор: freeKODE 21.11.2011, 12:39
Спасибо! Работает.
Если не лень, можно рассказать почему так?

Автор: Stolzen 21.11.2011, 13:28
Потому вы объявляете переменные in и out во второй раз и именно им присваиваете значения. Поля вашего класса при этом остаются нетронутыми и поэтому содержат в себе null.

Автор: Skipy 21.11.2011, 13:38
Потому что Вы инициализировали локальные переменные, а переменные класса так и имеют значение null.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)