Firebase因空指针异常而崩溃

16

Firebase 空指针异常。以下是附加的堆栈跟踪信息

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toLowerCase(java.util.Locale)' on a null object reference
       at com.firebase.tubesock.WebSocketHandshake.verifyServerHandshakeHeaders(WebSocketHandshake.java:96)
       at com.firebase.tubesock.WebSocket.runReader(WebSocket.java:365)
       at com.firebase.tubesock.WebSocket.access$000(WebSocket.java:30)
       at com.firebase.tubesock.WebSocket$2.run(WebSocket.java:108)
       at java.lang.Thread.run(Thread.java:818)

版本:最新版(截至2016年5月3日)2.5.2+

设备详情:LGE - lgls770运行Android 6.0且未root


这是否一直发生?您是否在代理后面?当升级到WebSocket连接的正确HTTP头未设置时,似乎会出现这种情况。 - jonnydee
我昨天刚添加了Firebase并推送了更新。但是对于一个用户来说,它崩溃了将近12次。 - Ashok Varma
堆栈跟踪总是相同的吗?您是否拥有比这个堆栈跟踪更多的信息?如果是这样,您可以分享它(或联系firebase-support@google.com分享它)吗? - Frank van Puffelen
1
你找到解决方案了吗?我也遇到了同样的问题。 - SimpleCoder
1
在我的情况下,这通常发生在新版本发布后不久,我相信是由 Google(Nuage Laboratory)进行的预发布报告测试期间发生的。在完成测试后,它们就不再出现了。 - Itapox
显示剩余2条评论
2个回答

4
下面的代码片段是在WebSocketHandshake.java中找到的verifyServerhandshakeHeaders方法的实现。
public void verifyServerHandshakeHeaders(HashMap<String, String> headers) {
    if (!headers.get("Upgrade").toLowerCase(Locale.US).equals("websocket")) {
        throw new WebSocketException("connection failed: missing header field in server handshake: Upgrade");
    } else if (!headers.get("Connection").toLowerCase(Locale.US).equals("upgrade")) {
        throw new WebSocketException("connection failed: missing header field in server handshake: Connection");
    }
}

如您所见,如果服务器在 握手(RFC 6455,4. Opening Handshake)的响应中没有包含升级 HTTP 标头,则此代码会抛出 NullPointerException
此外,由于此方法提供的 headers 实例是通过 new HashMap<String, String>() 创建的 (WebSocket.java:360),因此从服务器发送的 HTTP 标头必须区分大小写,尽管 HTTP 规范说“字段名称不区分大小写”(RFC 2616,4.2 Message Headers)。因此,例如,如果服务器以全大写字母发送升级 HTTP 标头,如 UPGRADE,TubeSock 将抛出 NullPointerException,尽管服务器的行为是正确的。

headers 实例应该由以下方式创建

new TreeMap<String, List<String>>(String.CASE_INSENSITIVE_ORDER)

正如我在某个地方指出的那样。

TubeSock的WebSocket实现甚至不验证Sec-WebSocket-Accept头,尽管RFC 6455要求进行验证。请参阅RFC 6455,4.1.客户端要求了解详细信息。


你提供了很多信息,但是解决方案是什么? - Rafael Lima

4

如果您正在使用之前版本的Firebase,则请更新Firebase库版本。

在我的情况下,我正在使用Firebase分析。

compile 'com.google.android.gms:play-services-analytics:9.8.0'

然后我用以下内容进行了更新。
compile 'com.google.android.gms:play-services-analytics:10.2.4'

在我的情况下,现在一切都正常工作。如果您有问题,请告诉我。

如果我的答案对您有帮助,请不要忘记增加我的回答投票。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接