Параметр okhttp3 .AddHeader, указанный как ненулевой, равен нулю

#android #kotlin #nullpointerexception #okhttp #android-12

Вопрос:

Несколько пользователей испытывают постоянные сбои приложений с момента обновления до Android 12. Проблема не возникает ни на одном из моих устройств или устройств моих друзей (также Android 12), поэтому я не могу понять, как ее исправить. Я не передаю здесь нулевое значение, поэтому я не уверен, что вызывает сбой. accessToken никогда не имеет значения null, или если оно когда-либо будет равно null, значение будет «нулевым на предъявителя». Я попытался добавить нулевые проверки, дополнительные журналы, чтобы получить больше информации, у меня действительно нет идей. Кто-нибудь знает, как я могу определить, что вызывает проблему, или есть ли какие-либо проблемы в приведенном ниже коде ?

трассировка стека из firebase

 Fatal Exception: java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter value  at okhttp3.Request$Builder.addHeader(:7)  at uk.co.evezy.driver.network.interceptors.RequestInterceptor.intercept(RequestInterceptor.kt:33)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)  at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:34)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)  at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)  at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)  at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)  at uk.co.evezy.driver.network.interceptors.NetworkConnectionInterceptor.intercept(NetworkConnectionInterceptor.kt:31)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)  at uk.co.evezy.driver.network.interceptors.UserAgentInterceptor.intercept(UserAgentInterceptor.kt:47)  at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)  at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)  at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:517)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)  at java.lang.Thread.run(Thread.java:920)  

Перехватчик, который я использую

 class RequestInterceptor @Inject constructor(private val userDataManager: UserDataManager, private val refreshTokenService: RefreshTokenService) : Interceptor {   override fun intercept(chain: Interceptor.Chain): Response {   var accessToken = ""   if (userDataManager.getUserAccessData() != null) {  accessToken = "Bearer ${userDataManager.getAuthToken()}"   if (userDataManager.isAuthTokenExpired()) {  accessToken = ""  runBlocking {  accessToken = "Bearer ${refreshTokenService.getNewTokenUsingRefreshToken()}"  }  }  }   val original = chain.request()  val builder = original.newBuilder()  .method(original.method, original.body)  .addHeader("Authorization", accessToken)  val newRequest = builder.build()   return chain.proceed(newRequest)  } }  

Остальные 2 перехватчика на всякий случай

 class UserAgentInterceptor @Inject constructor() : Interceptor {   override fun intercept(chain: Interceptor.Chain): Response {  val original = chain.request()   Timber.d("UserAgentInterceptor: ${chain.request()}")   val newUserAgent = String.format(  Locale...,  "%s %s(%s) (Android %s; Model: %s; Brand: %s; Device: %s; %s)",  "appName",  BuildConfig.VERSION_NAME,  BuildConfig.VERSION_CODE,  Build.VERSION.RELEASE,  Build.MODEL,  Build.BRAND,  Build.DEVICE,  Locale.getDefault().language  )   val builder = original.newBuilder()  .header("User-Agent", newUserAgent)  .method(original.method, original.body)  val newRequest = builder.build()   return chain.proceed(newRequest)  } }  
 class NetworkConnectionInterceptor @Inject constructor(private val application: Application) :  Interceptor {   override fun intercept(chain: Interceptor.Chain): Response {   Timber.d("NetworkConnectionInterceptor: ${chain.request()}")   val request = chain.request()  val response = chain.proceed(request)   if (!isInternetAvailable()) {  throw NoInternetException("No active internet connection")  }   return response  }  (...)  }   

Комментарии:

1. Это похоже на ошибку виртуальной машины Android, не похоже, что это должно произойти. Если это конкретно это место, вы, вероятно, можете добавить дополнительные проверки на наличие null и войти в систему, когда это произойдет. Сделайте var недействительным и защитите вызов AddHeader.