I'm using GSON to parse JSON from a web service. I don't have any issues with this on my test device or in the simulator, but I'm getting NullPointerException crashes in the Pre-Launch Report testing on the Play Console when I try to access one of the List objects.
I've tried checking the object for null before accessing it, but I'm still seeing the crash in the Pre-Launch Reports.
Here's the Hourly data class which contains the List object that's causing the crash:
data class Hourly(
#SerializedName("data") val data: List<Conditions> = listOf(),
#SerializedName("summary") val summary: String = "" //Partly cloudy in the evening
)
Here's where I'm accessing the object (with a bunch of extra checks to make sure the objects aren't null before accessing them):
if (forecastData == null || forecastData?.currently == null || forecastData?.hourly == null || forecastData?.hourly?.data == null)
return
val hourlyData = forecastData?.hourly?.data ?: return
if (forecastData?.hourly != null && forecastData?.hourly?.data != null && hourlyData.count() > 2) {
val nextHour = hourlyData[1]
pressure = nextHour.pressure
}
One other thing to note is that this code was all working fine for the past year, but when I updated the app to API 28 and Kotlin 1.3.50 this crash started happening.
Update
I tried setting pretty much every object in my data model class to nullable, but I'm still getting the crash. Here's the end of the crash log, in case that is helpful:
FATAL EXCEPTION: main
Process: com.xxx.xxxx, PID: 27844
java.lang.NullPointerException: throw with null exception
at com.xxx.xxxx.model.Hourly.getData(Hourly.java:3)
at com.xxx.xxxx.view.UserInterface.updateCurrently(UserInterface.java:38)
I assume based on this that I am supposed to check for null on hourly.data...
I have no idea why, but turning off minifyEnabled and turning on multidexEnabled in my release build settings fixed this bug. Glad I spent 3 whole days on this.
Related
Not able to generate test coverage for Elvis operator. I was used jacoco and kover.
If you put your mouse over the yellow highlight, Jacoco report would indicate how many branches are missed in code coverage. Your test is just hitting some cases.
Basically, jacoco sees your code like below.
// dataSyncResponse?.userpreferences?.tutorialCompleted?:""
if (dataSyncResponse != null) {
if (dataSyncResponse.userpreferences != null) {
return dataSyncResponse.userpreferences.tutorialCompleted
}
}
return ""
Did your test have provided a test case for
null dataSyncResponse
non null dataSyncResponse,
null userpreferences
non null userpreferences
null tutorialCompleted
non null tutorialCompleted
I have been trying to upload an image to aws s3 server using shared module KMM. It works very well in Android but in iOS I have been getting this issue :- Uncaught Kotlin exception: kotlin.native.IncorrectDereferenceException: illegal attempt to access non-shared
Now as much as I have searched about this I got to know it is related to something with frozen() but I am not sure what it is and how can I resolve this.
Code :-
actual class ClassName {
init {
ensureNeverFrozen()
}
actual fun imageUpload() {
var credentialsProvider = AWSCognitoCredentialsProvider(regionType = // Region here, identityPoolId = //identityPoolId here)
var configuration = AWSServiceConfiguration(region = // Region here, credentialsProvider = //credentialsProvider here)
AWSServiceManager.defaultServiceManager()?.defaultServiceConfiguration = configuration
val expression = AWSS3TransferUtilityUploadExpression()
// Start uploading using AWSS3TransferUtility
val awsTransferUtility = AWSS3TransferUtility.defaultS3TransferUtility()
val completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock
completionHandler = { _: AWSS3TransferUtilityUploadTask?, error: NSError? ->
if (error == nil) {
val url = AWSS3.defaultS3().configuration.endpoint()?.URL()
val publicURL = url?.URLByAppendingPathComponent("bucketName")?.URLByAppendingPathComponent("fileName")
// Image Upload Complete
} else {
// Image Upload failure
}
}
awsTransferUtility.uploadFile(
fileUrl!!,
bucket = "bucketName",
key = "fileName",
contentType = ".image",
expression = expression,
completionHandler = completionHandler. // Error pointed on this line
)
}
}
Now as soon as I call the function my app gets crashed pointing error to the completionHandler.
Error log :-
Uncaught Kotlin exception: kotlin.native.IncorrectDereferenceException: illegal attempt to access non-shared ClassName.$imageUpload$lambda-1$lambda-0$FUNCTION_REFERENCE$1#2803dc8 from other thread
at 0 iosApp 0x000000010cc1984f kfun:kotlin.Throwable#<init>(kotlin.String?){} + 95
at 1 iosApp 0x000000010cc138cd kfun:kotlin.Exception#<init>(kotlin.String?){} + 93
at 2 iosApp 0x000000010cc139fd kfun:kotlin.RuntimeException#<init>(kotlin.String?){} + 93
at 3 iosApp 0x000000010cc327fd kfun:kotlin.native.IncorrectDereferenceException#<init>(kotlin.String){} + 93
at 4 iosApp 0x000000010cc3461f ThrowIllegalObjectSharingException + 623
at 5 iosApp 0x000000010cd16fc2 _ZN12_GLOBAL__N_128throwIllegalSharingExceptionEP9ObjHeader + 34
at 6 iosApp 0x000000010cd170fd _ZN12_GLOBAL__N_136terminateWithIllegalSharingExceptionEP9ObjHeader + 13
at 7 iosApp 0x000000010cd1af0a _ZNK16KRefSharedHolder3refIL11ErrorPolicy3EEEP9ObjHeaderv + 58
at 8 iosApp 0x000000010cbf53ca _ZL39Kotlin_Interop_unwrapKotlinObjectHolderP11objc_object + 42
at 9 iosApp 0x000000010cbee050 _4b4d4d4c69623a736861726564_knbridge15 + 224
at 10 AWSS3 0x000000010d84509e -[AWSS3TransferUtility URLSession:task:didCompleteWithError:] + 4814
A native concurrency model available for preview. Check out New memory model migration guide. After release you shouldn't face any such problems, but until then the above answer is valid.
Try to call completionHandler.freeze()
Alternatively, move handler to function call(without storing it in a variable).
If inside the handler you're using some variables from outer scope, they may need to be frozen too. If none of first two methods works, try replacing content of the completion with just print() to see if it helps, and if it does - localize the problematic line by uncommenting parts of code one by one.
KMM concurrency model forbids accessing to mutable object from different threads, and freeze makes object non mutable so it can be used from different threads.
With coroutines objects gets frozen automatically when needed, but when you're switch threads without coroutines, you have to do it by your hands.
That's exactly what's happening here: AWS calls completionHandler from an other thread(which is quite usual for methods with completion)
Check out more about concurrency model here: https://kotlinlang.org/docs/mobile/concurrency-overview.html
This behaviour is what we had to manage with KMM for now, but soon it will be changed, this is the main blocker KMM to go from alpha to release, and the JetBrains team is focused on solving this particular problem so we don't have to use freeze() anymore.
Add below to gradle.properties
kotlin.native.binary.memoryModel=experimental
kotlin.native.binary.freezing=disabled
I'm using Android Studio 3.5, Kotlin, and databinding. I have a property setup for 2 way databinding:
var startValue: String
#Bindable get() {
return when(mode)
{
PullingModes.SOTrackingPaintShop->if(salesOrderInformation.zoeordh!!.psstart == null) "" else salesOrderInformation.zoeordh!!.psstart!!
else->""
}
}
set(value: String) {
if(mode == PullingModes.SOTrackingPaintShop && salesOrderInformation.zoeordh!!.psstart != value)
salesOrderInformation.zoeordh.psstart = value
notifyPropertyChanged(BR.startValue)
}
In the last line, I get a design time error of Unresolved Reference: startValue
The BR class is properly generated, and startValue exists in the generated BR class. The project builds and runs fine. I've tried all the common things to try to fix this--clean and rebuild, along with Invalidate caches and restart and still can't get the design time error to go away. I experience the same issue with the Google sample 2 way databinding project: https://github.com/googlesamples/android-databinding
Anyone else experience this and have a resolution for it?
i use kotlin coroutines encounter nullpointExecption but not show me just crashed no log to print
i code like this:
val job = GlobalScope.launch(Dispatchers.IO) {
val files = File(path).listFiles(videoFileFilter)
Log.d("yanghua", "${files.size}")
for (file in files) {
Log.d("yanghua", file.absolutePath)
}
}
the files is null because there no file matched,than files.size is nullpoint exception,but app crashed but not show me the exception,
and I use thread instead,it will be crash too but show me where the Exception,like this
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.huayang.localplayer/com.huayang.localplayer.FileExplorActivity}: java.lang.NullPointerException: Attempt to get length of null array
I don't know why? Anybody knows?
I have an application that send me user_email = null when it shouldn't. I don't understant it, and can't reproduce it in local. I would like to use acra reporting to report system state when user_email = null.
I know how to write custom variable:
ACRA.getErrorReporter().putCustomData("myVariable", myVariable);
but I don't know how to generate report if var is null, even if the system doesn't crash ( in my case my null variable does not crash the system)
if ( user_email == null) {
ACRA.getErrorReporter().handleSilentException(null);
}
See https://github.com/ACRA/acra/wiki/AdvancedUsage#wiki-Sending_reports_for_caught_exceptions