【问题标题】:Blocking multithreaded TCP Server NullPointerException debugging阻塞多线程 TCP Server NullPointerException 调试
【发布时间】:2014-02-21 00:33:44
【问题描述】:

我有一个接受数据并将其保存到文本文件的 TCP 服务器。然后它使用该文本文件创建图像并将其发送回客户端。每隔几个小时,我就会收到一个NullPointerException,它会被扔给之后连接的每个客户端。我不确定如何调试它,因为我无法自己复制它。

有没有人有任何调试实践来帮助我弄清楚为什么这会成为一个问题?

正在运行的服务器正在运行 Ubuntu 12.04 i386,具有 2 GB 的 RAM。我最初的怀疑是某些事情没有正确关闭并产生问题,但据我所知,一切都应该关闭。

    ServerSocket echoServer = null;
    Socket clientSocket = null;
    try {
        echoServer = new ServerSocket(xxx);
    } catch (IOException e) {
        System.out.println(e);
    }

    while(true)
    {
            InputStream is = null;
            FileOutputStream fos = null;
            BufferedOutputStream bos = null;
            int bufferSize = 0;
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            BufferedOutputStream out = null;
        try {

            //Receieve text file
            is = null;
            fos = null;
            bos = null;
            bufferSize = 0;
            String uid = createUid();

            try {
                clientSocket = echoServer.accept();
                clientSocket.setKeepAlive(true);
                clientSocket.setSoTimeout(10000);
                System.out.println("Client accepted from: " + clientSocket.getInetAddress());
            } catch (IOException ex) {
                System.out.println("Can't accept client connection. ");
            }

            try {
                is = clientSocket.getInputStream();
                bufferSize = clientSocket.getReceiveBufferSize();
                System.out.println("Buffer size: " + bufferSize);
            } catch (IOException ex) {
                System.out.println("Can't get socket input stream. ");
            }

            try {
                fos = new FileOutputStream("/my/diretory/" + uid + ".txt");
                bos = new BufferedOutputStream(fos);

            } catch (FileNotFoundException ex) {
                System.out.println("File not found. ");
            }

            byte[] bytes = new byte[bufferSize];

            int count;

            while ((count = is.read(bytes)) > 0) {
                bos.write(bytes, 0, count);
                System.out.println("Receiving... " + count);
            }

            System.out.println("Done receiving text file");
            bos.flush();
            bos.close();
            fos.close();

            //image
            String[] command = new String[3];
            command[0] = "python";
            command[1] = "imagecreationfile.py";
            command[2] = uid;
            System.out.println("Starting python script");   
            Boolean success = startScript(command);
            if(success)
            {
                System.out.println("Script completed successfully");
                //Send image here
                String image = "/my/directory/" + uid + ".png";
                File imageFile = new File(image);
                long length = imageFile.length();
                if (length > Integer.MAX_VALUE) {
                    System.out.println("File is too large.");
                }

                bytes = new byte[(int) length];
                fis = new FileInputStream(imageFile);
                bis = new BufferedInputStream(fis);
                out = new BufferedOutputStream(clientSocket.getOutputStream());

                count = 0;
                while ((count = bis.read(bytes)) > 0) {
                    out.write(bytes, 0, count);
                    System.out.println("Writing... " + count);
                }

                out.flush();
                out.close();
                fis.close();
                bis.close();
            }
            else
            {
                System.out.println("Script failed");
            }


            System.out.println("Closing connection");
            is.close();
            clientSocket.close();
        } catch (Exception e) {
            System.out.println(e); //This is where the exception is being caught

        }

        if(!clientSocket.isClosed())
        {
            try {
                clientSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        try {
        if(is != null)
            is.close();

        if(fos != null)
            fos.close();

        if(bos != null)
            bos.close();

        if(fis != null)
            fis.close();

        if(bis != null)
            bis.close();

        if(out != null)
            out.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

【问题讨论】:

  • 发布堆栈跟踪,并确定哪个源代码行引发了异常。没有它,它只是一个猜谜游戏。
  • 两种情况的答案都是一样的。获取堆栈跟踪。没有它你什么都做不了,一旦你有了它,解决方案就会很明显。

标签: java android debugging exception tcp


【解决方案1】:

可能在您的某个 try-catch 范围内引发了异常。 并且下一个 try-catch 作用域发现了 null 变量。

例如

//Receieve text file
        is = null;
        fos = null;
        bos = null;
        bufferSize = 0;
        String uid = createUid();

        try {
            clientSocket = echoServer.accept();
            clientSocket.setKeepAlive(true);
            clientSocket.setSoTimeout(10000);
            System.out.println("Client accepted from: " + clientSocket.getInetAddress());
        } catch (IOException ex) {
            System.out.println("Can't accept client connection. ");
        }

        try {
            is = clientSocket.getInputStream();
            bufferSize = clientSocket.getReceiveBufferSize();
            System.out.println("Buffer size: " + bufferSize);
        } catch (IOException ex) {
            System.out.println("Can't get socket input stream. ");
        }

如果在“clientSocket = echoServer.accept();”中抛出 IOException ,它将打印“无法接受客户端连接。”。 当,“is = clientSocket.getInputStream();”执行时,它会抛出 NullPointer,因为“clientSocket”没有正确初始化。 我的建议是,除非有必要,否则不要破坏不同 try-catch 范围内的序列语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多