当前位置: 首页 > 知识库问答 >
问题:

IOException:流已关闭,NullPointerException与HttpURLConnection断开连接

商辰钊
2023-03-14

每个人 都。我正在编写一个函数,该函数使用类 httpURL 连接连接到服务器。在代码中,我建立了一个连接,按顺序调用了获取输出流()和获取输入流()方法。然后我断开连接。在此之后,我尝试获取通过 getInputStream() 方法获得的数据,但编译器提醒 NullPointer 异常。

代码如下:

    DataOutputStream out = null;
    InputStreamReader inStrReader = null;
    BufferedReader reader = null;
    HttpURLConnection connection = null;

    try {
        URL postUrl = new URL(null, url, new sun.net.www.protocol.https.Handler());
        connection = (HttpURLConnection) postUrl.openConnection();
        ...//some setting methods
        connection.connect();
        out = new DataOutputStream(connection.getOutputStream());
        out.writeBytes(JSONObject.toJSONString(param));
        out.flush();
        out.close();

        inStrReader = new InputStreamReader(connection.getInputStream(), "utf-8");
        reader = new BufferedReader(inStrReader);
        connection.disconnect();   //<--HERE, release the connection
        StringBuilder stringBuilder = new StringBuilder();
        for (String line = reader.readLine(); line != null; line = reader.readLine()) {     //<--null pointer
            stringBuilder.append(line);
        }
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    } finally {
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (inStrReader != null) {
            try {
                inStrReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

在调试尝试之后,当我将断开连接行移到finally模块的最后一行时,一切都会好起来。但我感到困惑,这是在我已经将“inputstream”值赋给“reader”时发生的。

谢谢。

共有3个答案

瞿宏儒
2023-03-14

你做每件事的顺序都错了。这没有意义。

>

  • 您正在断开连接,然后希望能够读取连接。这里完全是胡说八道。通常您根本不应该断开连接,因为您会干扰HTTP连池。只需将其删除,或者,如果您必须拥有它,请在所有关闭后进行。

    您以错误的顺序关闭,但根本不需要关闭StrReader中的。关闭BufferedReader可以做到这一点。只需删除StrReader.close()中的所有代码。

    你要关闭两次。不要这样做。

    connect()隐式发生。您不需要自己调用它。

    < code >新URL(url)就足够了。大约从2003年开始,您就不需要提供HTTPS 处理程序

  • 程承恩
    2023-03-14

    请记住它是一个“流”。您需要有一个活动连接才能从流中读取。只有在从流中检索数据后才关闭连接。

    尤茂材
    2023-03-14

    分配不等于读取,读取器.readLine() 从连接开始读取。

    输入流读取器正在使用连接来读取字节,在它使用连接读取字节之前断开连接

    InputStreamReader是从字节流到字符流的桥梁:它读取字节和。。。

     类似资料:
    • 我使用weblogic应用服务器和oracle数据库。我使用jdbc与oracle数据库通信。我从weblogic数据源获得连接,并向表中插入一条记录。问题是,当我想关闭连接(插入数据库后)时,我会遇到一个异常(连接已经关闭)。这是我的代码: 但是联系。close语句引发异常: 我试图避免连接。close语句(因为我教过连接是自动关闭的!!但过了一段时间,所有的连接都打开了,因此引发了一个异常)

    • 我想使用stream getfirst方法两次,但是出现了一个错误,即(java.lang.IllegalStateException:stream已经被操作或关闭),并且这个流代码以此处命名的注释开始。

    • 我尝试使用HttpUrlConnection使我的应用程序与我的php服务器通信。我写了一个在我的电脑上运行良好的类,但当我在手机上执行它时,它根本不起作用。 这是我的代码: DataOutputStream out=新的DataOutputStream(connection.getOutputStream());引发此异常: 我在电脑上测试了这段代码,它没有引发任何异常。我的清单: 谢谢

    • 运行CRON JOB时,得到一个异常,说连接已经关闭。应用程序正在dropwizard上运行,以下是数据库配置 请帮助解决问题。

    • 当从流中收集数据时,我得到了一个烦人的NullPointerException。在我看来,我不应该得到一个,这是困扰我的。 以下是错误代码: descriptiveData不是null,也不包含null对象,但getContrats的结果可能是。这是一个完全有效的业务情况,我认为用过滤器处理它是这样做的方法,但我所能得到的只有这个例外: 谢谢@尼古拉斯的答案确实正确。

    • 我使用AWS DocumentDB作为我在node中开发的应用程序中的数据库。与MongoDB兼容的js。我已经使用MongoClient连接到我的数据库。我的应用程序会执行,但每次执行时会连接大约1000 DB的数据,然后会出现错误: 我尝试使用关闭连接,然后它给出连接池已关闭。我相信这个问题是由于太多的数据库连接造成的。 如何释放MongoDB中的连接?感谢任何帮助。