#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.