【问题标题】:Firebase crash due to null pointer exception由于空指针异常导致 Firebase 崩溃
【发布时间】:2016-08-27 22:40:02
【问题描述】:

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 和无根

【问题讨论】:

  • 这种情况是否持续发生?你在代理后面吗?这似乎发生在未设置用于升级到 WebSocket 连接的正确 HTTP 标头时。
  • 我昨天刚刚添加了firebase并推送了更新。它为 1 个用户崩溃了近 12 次。
  • 堆栈跟踪总是一样的吗?除了这个堆栈跟踪之外,您还有更多信息吗?如果是,您可以分享吗(或联系 firebase-support@google.com 分享)?
  • 您找到解决方案了吗?我也面临同样的问题。
  • 就我而言,这发生在新版本发布后不久,我相信在 Google (Nuage Laboratoire) 为预发布报告所做的测试期间。完成测试后,它们不再发生。

标签: android nullpointerexception websocket firebase


【解决方案1】:

下面的代码sn-p是@987654321@中的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&lt;String, String&gt;()@987654323@:360)创建的,所以从服务器发送的HTTP头必须区分大小写,尽管HTTP规范“字段名称不区分大小写”(RFC 2616,4.2 Message Headers)。因此,例如,如果服务器以全大写字母(如 UPGRADE)发送 Upgrade HTTP 标头,尽管服务器的行为是正确的,但 TubeSock 会抛出 NullPointerException

headers 实例应该由

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

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

尽管 RFC 6455 要求验证,但 TubeSock 的 WebSocket 实现甚至不验证 Sec-WebSocket-Accept 标头。有关详细信息,请参阅 RFC 6455、4.1. Client Requirements

【讨论】:

  • 你提供了很多信息,但解决方案是什么
【解决方案2】:

如果您使用的是以前版本的 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'

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

如果我的回答对你有帮助,别忘了增加我的回答投票。

【讨论】:

    猜你喜欢
    • 2015-12-11
    • 2014-02-24
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    相关资源
    最近更新 更多