java - jdk.incubator.httpclient 中的 NullPointerException

标签 java http nullpointerexception java-10 java-http-client

我正在尝试使用来自 JDK10 的新的 shiny httpclient。 代码非常简单。我使用多个线程的同步 HTTP 调用:

private final HttpClient httpClient = HttpClient.newBuilder()
        .executor(Utils.newFixedThreadPoolExecutor(1, "HttpClient"))
        .build();

private JsonObject useHttpClient(URL url, String params) throws Exception {
    HttpRequest req = HttpRequest.newBuilder()
            .uri(url.toURI())
            .setHeader("Connection", "keep-alive")
            .setHeader("Accept-Encoding", "gzip")
            .timeout(timeout)
            .POST(HttpRequest.BodyPublisher.fromString(params))
            .build();
    HttpResponse<InputStream> response = httpClient.send(req, HttpResponse.BodyHandler.asInputStream());
    if (response.statusCode() != 200) {
        throw new IOException("Server returned " + response.statusCode());
    }
    String encoding = response.headers().firstValue("content-encoding").orElse("");
    return parseResponseStream(encoding, response.body());
}

有时我会遇到 NPE:

java.lang.NullPointerException: null
at jdk.incubator.http.internal.hpack.HeaderTable$Table.remove(HeaderTable.java:455) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.internal.hpack.HeaderTable.evictEntry(HeaderTable.java:264) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.internal.hpack.HeaderTable.put(HeaderTable.java:233) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.internal.hpack.HeaderTable.put(HeaderTable.java:215) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.internal.hpack.Decoder.resumeLiteralWithIndexing(Decoder.java:464) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.internal.hpack.Decoder.proceed(Decoder.java:268) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.internal.hpack.Decoder.decode(Decoder.java:246) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.Http2Connection.decodeHeaders(Http2Connection.java:471) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.Http2Connection.processFrame(Http2Connection.java:635) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.internal.frame.FramesDecoder.decode(FramesDecoder.java:156) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.Http2Connection$FramesController.processReceivedData(Http2Connection.java:195) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.Http2Connection.asyncReceive(Http2Connection.java:528) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.Http2Connection$Http2TubeSubscriber.processQueue(Http2Connection.java:1054) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.internal.common.SequentialScheduler$SynchronizedRestartableTask.run(SequentialScheduler.java:175) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.internal.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:147) ~[jdk.incubator.httpclient:?]
at jdk.incubator.http.internal.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198) ~[jdk.incubator.httpclient:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135) [?:?]

我的代码有问题吗?此异常的原因是什么?

C:\Program Files\Java\jdk-10\bin>java -version
java version "10" 2018-03-20
Java(TM) SE Runtime Environment 18.3 (build 10+46)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode)

最佳答案

Are there any problem in my code?

作为熟悉 JDK HTTP 客户端 API 的人,我看不出您发布的代码有任何具体问题。

What can be reason for this exception?

异常的原因是JDK HTTP Client HPACK代码中的一个bug。您无法在您的代码中执行任何操作来解决它。

有关 JDK HPACK 错误的具体信息可以在 https://bugs.openjdk.java.net/browse/JDK-8200625 找到(复制技术信息,来自前面提到的 OpenJDK JIRA 问题,这里不会增加值(value),并且可能很快变得陈旧)

关于java - jdk.incubator.httpclient 中的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49587380/

相关文章:

java - 给定字符串的可能回文检查 - 需要高效代码

java - Grails 1.3.3 过滤器 - NullPointerException 或 ClassCastException

http - 如何在使用 curl 的 POST 请求后获取 HTTP 响应 header 和正文

http - NGINX 根据 header 的值设置 cookie

java.lang.NullPointerException 第 53 行

java - Java中String类的垃圾回收

java - 类型集不带参数

javascript - 在 AngularJS 中使用 $http.get 检索 JSON 时出现错误 400

java - Eclipse - 生成 JavaDoc - NullPointerException

java - 如何制作 Java Canvas 游戏循环