null 不能强制转换为非 null 类型 kotlin.String NullPointer 异常

Posted

技术标签:

【中文标题】null 不能强制转换为非 null 类型 kotlin.String NullPointer 异常【英文标题】:null cannot be cast to non-null type kotlin.String NullPointer Exception 【发布时间】:2022-01-13 04:00:47 【问题描述】:

我在我的实体类中声明不可为空,但是当我访问这些变量时,我得到NullPointerException。我面临以下类型的错误:

java.lang.NullPointerException: null cannot be cast to non-null type kotlin.String
    at com.nilmani.chatdemochat.controller.ChatController.addUser(ChatController.kt:31) ~[main/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:169) ~[spring-messaging-5.3.13.jar:5.3.13]
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:119) ~[spring-messaging-5.3.13.jar:5.3.13]
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch(AbstractMethodMessageHandler.java:569) ~[spring-messaging-5.3.13.jar:5.3.13]
    at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:511) ~[spring-messaging-5.3.13.jar:5.3.13]
    at org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler.handleMatch(SimpAnnotationMethodMessageHandler.java:94) ~[spring-messaging-5.3.13.jar:5.3.13]
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler.java:524) ~[spring-messaging-5.3.13.jar:5.3.13]
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:458) ~[spring-messaging-5.3.13.jar:5.3.13]
    at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:144) ~[spring-messaging-5.3.13.jar:5.3.13]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]

ChatMessage.kt

package com.nilmani.chatdemochat.model

import com.nilmani.chatdemochat.enum.MessageType

data class ChatMessage (
    var messageType: MessageType?=null,
    val content:String="",
    var sender:String="")

ChatController.kt

@MessageMapping("/chat/roomId/addUser")
fun addUser(@DestinationVariable roomId: String,@Payload chatMessage: ChatMessage,messageHeader:SimpMessageHeaderAccessor)
   val currentRoomId: String = messageHeader.sessionAttributes?.put("roo_id",roomId) as String
   if (currentRoomId != null)
       val leaveMessage = ChatMessage()
       leaveMessage.messageType = MessageType.LEAVE
       leaveMessage.sender = chatMessage.sender
       messageingTemplate.convertAndSend(format("/channel/%s",currentRoomId),leaveMessage)
   
   messageHeader.sessionAttributes?.set("username", chatMessage.sender)
   messageingTemplate.convertAndSend(format("/channel/%s",roomId),chatMessage)

我在这一行得到NullPointerException

val currentRoomId: String = 
     messageHeader.sessionAttributes?.put("roo_id",roomId) as String

当加入另一个用户聊天时,它会出现这种类型的错误,并且新进入的用户无法连接到聊天应用程序。

【问题讨论】:

【参考方案1】:

messageHeader.sessionAttributes?.put("roo_id",roomId) 的结果是 null,但您尝试将其强制转换为非空字符串。

所以要么messageHeader.sessionAttributesnull,要么put("roo_id",roomId) 的结果为空。

【讨论】:

messageHeader.sessionAttributesnullroomIdnull

以上是关于null 不能强制转换为非 null 类型 kotlin.String NullPointer 异常的主要内容,如果未能解决你的问题,请参考以下文章

kotlin.TypeCastException: null 不能转换为非 null 类型 com.midsizemango.databasekotlin.Note

致命异常 java.lang.NullPointerException: null 不能转换为非 null 类型 kotlin.String

null 不能转换为非 null 类型 android.support.v4.view.ViewPager - KOTLIN

Android Kotlin:null 不能转换为非 null 类型 com.android.app.ui.category.CategoryAdapter.ViewHolder 想要在 recycl

如何在多个(超过 2 个)集合中仅强制一组字段为非 NULL?

JAVA中对null进行强制类型转换