Изображение существует, но не null, но я получаю исключение NullPointerException

Краткое введение

Приложение, над которым я сейчас работаю, принимает изображение из JSON, если оно правильно его использует, и сохраняет его как загружаемое изображение при следующем использовании.

проблема

Внезапно приложение начало сбой при загрузке и при дальнейшем осмотре, проверка file.isFile && file.canRead() я получил, возвращает положительный результат, но он по-прежнему падает с BitmapFactory.decodeStream . Количество байтов файла составляет 8k, по сравнению с другими устройствами, которые я использовал, где у того же изображения на самом деле имеется 43k байт.

Изображение json является частью гораздо более крупного сообщения json (приблизительно 500 кб), и оно не в начале и не в конце. Последнее использование перед этим произошло, не было никакой проблемы с загрузкой или знаком, показывающим, что загрузка могла быть остановлена ​​на полпути. Несмотря на это, изображение по-прежнему имеет 8 КБ, поэтому я предполагаю, что он должен просто создать что-то с той частью, которую он имеет, а затем выбрасывает NullPointerException

Я использую Android Studio 3.0 Beta 4 и код в Kotlin. Я должен был запустить его на этом устройстве 100 раз, и даже после этого он отлично работает на других тестовых устройствах, плюс приложение iOS, которое получает тот же самый json при запуске

Что я ищу

Совет о том, как бороться с проблемой, или информация о том, является ли это известной ошибкой в ​​Android или Kotlin. Возможно, я смогу переустановить приложение на устройстве, и он будет в порядке, но не хотел бы, чтобы это произошло после того, как приложение было выпущено, если я могу это предотвратить.

LaterEdit : с предложением Xaviers , я скопировал файл на рабочий стол, и он определенно искажен, когда он загружает его, на самом деле показывает серьезное искаженное изображение вещей, работающих на Mac. Я попытался загрузить его, но он просто отображается как пустое белое изображение. Он по-прежнему имеет 8kb, поэтому он содержит некоторые данные. Как это возможно и его можно предотвратить?

Код

Загружая приложение, я проверяю, существует ли изображение и загружайте его в imageView

 try { if (DesignSupport().imageExists("logo", this)) { if (DesignSupport().loadImage("logo", this) != null) { imageView.setImageBitmap(DesignSupport().loadImage("logo", this)) } } } catch (error: Error) { Log.i(tag, error.stackTrace.toString()) } 

Проверьте, существует ли изображение

 fun imageExists(string: String, context: Context) : Boolean { val path = android.os.Environment.getExternalStorageDirectory().toString() + "/" + context.applicationInfo.name + "/" + string + ".png" val file = File(path) return (file.isFile && file.canRead()) } 

Загрузите изображение

  fun loadImage(string: String, context: Context) : Bitmap { val path = android.os.Environment.getExternalStorageDirectory().toString() + "/" + context.applicationInfo.name + "/" + string + ".png" val fis = FileInputStream(path) // it crashes at the next line, but when I print fis.available() it returns 8200 return BitmapFactory.decodeStream(fis) } 

Журнал сбоев

  java.lang.RuntimeException: Unable to start activity ComponentInfo{.GeneralAccessScreens.startupScreen}: java.lang.IllegalStateException: BitmapFactory.decodeStream(fis) must not be null at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2412) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2470) at android.app.ActivityThread.access$900(ActivityThread.java:174) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:146) at android.app.ActivityThread.main(ActivityThread.java:5593) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.IllegalStateException: BitmapFactory.decodeStream(fis) must not be null at SupportMethods.DesignSupport.loadImage(DesignSupport.kt:45) at .GeneralAccessScreens.startupScreen.onCreate(startupScreen.kt:34) at android.app.Activity.performCreate(Activity.java:5458) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 

Импортные заявления

 import android.app.Activity import android.content.Context import android.content.res.Resources import android.graphics.Bitmap import android.graphics.BitmapFactory import android.util.Base64 import android.util.Log import android.view.inputmethod.InputMethodManager import java.io.File import java.io.FileInputStream import java.io.FileOutputStream 

Вы уверены, что авария в том же loadImage() а не на другом? В журнале ошибок говорится, что авария в BitmapFactory.decodeReso…ystem(), R.drawable.logo) , которая кажется другой.

Кроме того, вы сначала попытались сделать перестроить? Я видел много проблем в бета-версиях AS 3.0, которые разрешаются с помощью этого.

Из документации , даже если fis равно null, она не должна сбой с этой ошибкой, просто верните null (акцент мой).

Декодирование входного потока в растровое изображение. Если входной поток является нулевым или не может использоваться для декодирования растрового изображения, функция возвращает значение null. Позиция потока будет там, где она была после чтения закодированных данных.

Просто чтобы отказаться от вещей, можете ли вы добавить оператор import для BitmapFactory ? Должен быть import android.graphics.BitmapFactory .

Конкретное исключение вызывается из-за BitmapFactory.decodeStream(fis) что BitmapFactory.decodeStream(fis) возвращает значение null пока функция указана для возврата объекта, не подлежащего обнулению. Либо сделайте возвращаемое значение нулевым, либо определите соответствующую замену, если он возвращает null .

На заднем плане Kotlin генерирует следующий код «java»:

 Bitmap tmp = BitmapFactory.decodeStream(fis); Intrinsics.checkExpressionValueIsNotNull(tmp, "BitmapFactory.decodeStream(fis)"); return tmp; 

Источником исключения является вызов Intrinsics.checkExpressionValueIsNotNull .