在Java中调用ArrayList.get()时获取NullPointerException?

时间:2012-10-22 11:05:03

标签: java sockets nullpointerexception

所以我有一个聊天室,它曾经工作但我稍微改变了代码以尝试一些东西而且它们没有用,所以我试图恢复原来的代码,但我不确定我是什么做错了,因为现在它抛出一个NullPointerException。我的代码有一个PrintWriters的ArrayList和一个方法showAll()就像它说的那样;向聊天室中的所有人发送消息。所以基本上我想知道的是我怎么得到例外?

    //This is the main code, used to add printwriters to the arraylist and to connect to clients
    //The Communicate thread is used to get input from users and use the showAll() method with that input
    public void listen() {
        listWriters = new ArrayList<PrintWriter>();
        try {
            scanner = new Scanner(System.in);
            portnum = getPortNumber(scanner);
            System.out.println("Listening on " + portnum);
            serverSocket = new ServerSocket(portnum);
            while(true) {
                clientcommunicate = serverSocket.accept();
                System.out.println("Connection accepted: " + clientcommunicate.toString());

                PrintWriter client = new PrintWriter(clientcommunicate.getOutputStream(), true);
                listWriters.add(client);
                Thread t = new Thread(new Communicate(clientcommunicate));
                t.start();
            }
        } catch (IOException ioe) {
            System.err.println(ioe);
            System.err.println("Error.");
            System.exit(1);
        }
    }

    //This uses a printwriter obtained in the Communicate thread; the thread initializes a socket in it with the socket obtained in the constructor
    public void showAll(String msg, PrintWriter printwriter) {
        for(int i = 0; i < listWriters.size(); i++) { //this is where the exception is thrown
            if(!listWriters.get(i).equals(printwriter)) { //if I change the paramater listWriters.size() to a regular integer like 3, and only create 2 clients or even less, the exception is thrown here instead
                listWriters.get(i).println(msg);
            }
        }
    }

编辑:

好的,所以我不再收到错误,但现在我似乎无法发送消息。如果我从客户端发送消息,则没有错误,但消息不会显示在任一客户端上。

3 个答案:

答案 0 :(得分:6)

您正在尝试取消引用NullPointerException,因为您试图取消引用(即调用方法或从中读取字段),变量为null

在这种情况下,很明显listWriters为空(因为它是唯一在发生异常的行上取消引用的变量 - 查找.个字符)。由于这是通过listen()方法分配的,因此如果您在调用showAll()之前致电listen() ,我猜您会收到此错误。

一个非常简单的字段是将listWriters分配给其声明中的空列表,这样它就永远不会为空:

private List<PrintWriter> listWriters = new ArrayList<PrintWriter>();

根据应用程序的并发性要求,您可能需要做一些更复杂的工作,但一般原则是您必须在之前初始化,然后尝试从中读取。< / p>

答案 1 :(得分:0)

您必须在showAll方法之前调用listen方法。 您的ListWriters方法尚未在listen方法中初始化showAll

答案 2 :(得分:0)

这可能是因为您已初始化listWriters内部listen()方法。

因此,如果在showAll()方法之前调用listen()方法,则null会获得listWriters值(假设您已声明listWriters作为实例变量,并没有在那里初始化。)

您可以在声明它的地方尝试initializing

private List<PrintWriter> listWriters = new ArrayList<PrintWriter>();