图像存在,而不是null,但我得到一个NullPointerException

时间:2017-09-04 15:38:15

标签: android kotlin bitmapfactory

简介

我正在处理的应用程序,从JSON获取图像,如果正确使用它并在下次使用时将其保存为加载图像。

问题

突然之间,应用程序在加载时开始崩溃,并且在进一步检查时,我所进行的file.isFile && file.canRead()检查返回正值,但它仍然在BitmapFactory.decodeStream崩溃。 与我使用的其他设备相比,该文件的字节数为8k,其中同一图像实际上有43k字节。

图像json是一个更大的json消息(大约500kb)的一部分,它不是在开始或结束。在此之前的最后一次使用是没有问题加载或标志显示下载可能已经中途停止。即便如此,图像仍然有8kb,所以我想它应该只用它所拥有的部分创建一些东西而不是抛出NullPointerException

我使用的是Android Studio 3.0 Beta 4,代码在Kotlin中。我必须在这个设备上运行100次,即使在此之后它在其他测试设备上运行完全正常,加上在启动时获得完全相同的json的iOS应用程序

我在寻找什么

有关如何处理问题的建议,或者是否是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

2 个答案:

答案 0 :(得分:2)

抛出特定异常,因为BitmapFactory.decodeStream(fis)返回null,同时指定函数返回不可为空的对象。如果返回值为null,则将返回值设为可为空或定义适当的替换值。

在后台,Kotlin生成以下“java”代码:

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

例外的来源是Intrinsics.checkExpressionValueIsNotNull电话。

答案 1 :(得分:1)

你确定崩溃是在同一个loadImage()方法而不是另一个吗?在错误日志中,它表示崩溃在BitmapFactory.decodeReso…ystem(), R.drawable.logo),这似乎是另一个。

另外,你有没有尝试过重建?我已经看到AS 3.0测试版中的许多问题都可以解决。

documentation开始,即使fis为空,也不会因此错误而崩溃,只需返回null(重点是我的)。

  

将输入流解码为位图。 如果输入流为空,或者不能用于解码位图,则该函数返回null。流的位置将是读取编码数据后的位置。

只是为了丢弃内容,您可以为import添加BitmapFactory语句吗?应该是import android.graphics.BitmapFactory