2016-05-03 15 views
7

Ngoại lệ con trỏ null của Firebase. Kèm stacktrace xuống dướiSự cố Firebase do ngoại lệ con trỏ null

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) 

Version: mới nhất (2.5.2+) như 3-may-2016

Chi tiết thiết bị: LGE - lgls770 chạy android 6.0 và Non-Rooted

+0

Điều này có xảy ra không? Bạn có đằng sau proxy không? Điều này dường như xảy ra khi các tiêu đề HTTP đúng để nâng cấp lên kết nối WebSocket không được đặt. – jonnydee

+0

Tôi đã thêm cơ sở dữ liệu chỉ vào hôm qua và đã cập nhật. Nó đã bị lỗi cho 1 người dùng gần 12 lần. –

+0

Theo dõi ngăn xếp luôn giống nhau không? Bạn có nhiều thông tin hơn chỉ là dấu vết ngăn xếp này không? Nếu có, bạn có thể chia sẻ nó (hoặc liên hệ với [email protected] để chia sẻ nó) không? –

Trả lời

3

Mã đoạn mã bên dưới là triển khai phương thức verifyServerhandshakeHeaders trong 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"); 
    } 
} 

Như bạn có thể thấy, nếu máy chủ không bao gồm tiêu đề HTTP Upgrade trong phản ứng của cái bắt tay mở (RFC 6455, 4. Opening Handshake), mã này ném NullPointerException.

Bên cạnh đó, vì dụ headers trao cho phương pháp này được tạo ra bởi new HashMap<String, String>() (WebSocket.java :360), tiêu đề HTTP gửi từ máy chủ phải case-sensitive mặc dù đặc tả HTTP nói "Các tên trường là case-insensitive " (RFC 2616, 4.2 Message Headers). Do đó, ví dụ: nếu máy chủ gửi tiêu đề HTTP nâng cấp bằng tất cả các chữ cái viết hoa như UPGRADE, TubeSock sẽ ném NullPointerException mặc dù hành vi của máy chủ là chính xác.

headers dụ nên được tạo ra bởi

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

như tôi đã chỉ ra tại một nơi nhất định.

Triển khai WebSocket của TubeSock thậm chí không xác minh tiêu đề Sec-WebSocket-Accept mặc dù RFC 6455 yêu cầu xác minh. Xem RFC 6455, 4.1. Client Requirements để biết chi tiết.

3

Nếu bạn đang sử dụng phiên bản firebase trước đó, hãy cập nhật phiên bản thư viện của cơ sở firebase.

Trong trường hợp của tôi, tôi đã sử dụng các phân tích căn cứ hỏa lực

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

Sau đó, tôi được cập nhật rằng với

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

Mọi thứ bây giờ đang làm việc tốt trong case.still của tôi nếu bạn có vấn đề cho tôi biết .

nếu câu trả lời của tôi sẽ giúp bạn thì đừng quên tăng số phiếu bầu của tôi.

Các vấn đề liên quan