2016-05-03 23 views
7

Eccezione puntatore nullo di Firebase. stacktrace allegato in bassoArresto di Firebase dovuto all'eccezione del puntatore nullo

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) 

Versione: gli ultimi (2.5.2+) a partire dal 3-mag-2016

dispositivo Dettagli: LGE - lgls770 in esecuzione Android 6.0 e non Radicata

+0

Questo succede in modo coerente? Sei dietro un proxy? Ciò sembra verificarsi quando le intestazioni HTTP corrette per l'aggiornamento a una connessione WebSocket non sono impostate. – jonnydee

+0

Ho aggiunto Firebase solo ieri e ho fatto l'aggiornamento. Si è schiantato per 1 utente quasi 12 volte. –

+0

La traccia dello stack è sempre la stessa? Avete più informazioni rispetto a questa traccia dello stack? In tal caso, puoi condividerlo (o contattare [email protected] per condividerlo)? –

risposta

3

Il codice snippet di seguito è l'implementazione del metodo verifyServerhandshakeHeaders trovato in WebSocketHandshake.java.

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"); 
    } 
} 

Come si può vedere, se il server non include un header HTTP aggiornamento nella risposta della stretta di mano apertura (RFC 6455, 4. Opening Handshake), questo codice getta NullPointerException.

Inoltre, perché l'istanza headers dato a questo metodo è stato creato da new HashMap<String, String>() (WebSocket.java :360), intestazioni HTTP inviati dal server devono essere maiuscole e minuscole, anche se le specifiche HTTP dice "I nomi dei campi sono case-insensitive " (RFC 2616, 4.2 Message Headers). Pertanto, ad esempio, se un server invia un'intestazione HTTP di aggiornamento in tutte le lettere maiuscole come UPGRADE, TubeSock genera NullPointerException anche se il comportamento del server è corretto.

headers istanza deve essere creato da

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

come ho sottolineato in un determinato luogo.

L'implementazione WebSocket di TubeSock non verifica nemmeno l'intestazione Sec-WebSocket-Accept sebbene la verifica sia richiesta da RFC 6455. Vedere RFC 6455, 4.1. Client Requirements per i dettagli.

3

Se si sta utilizzando la versione precedente di Firebase, aggiornare la versione della libreria di Firebase.

Nel mio caso stavo usando l'analytics Firebase

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

Poi ho aggiornato che con

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

Tutto sta ora lavorando bene nel mio case.still se avete problema fatemi sapere .

se la mia risposta ti aiuterà allora non hai dimenticato di aumentare il mio voto di risposta.