错误"不能为空"在Kotlin

时间:2017-10-10 08:27:10

标签: java android kotlin inputstream zipinputstream

.zip文件中有多个文件,我试图获取。尝试解压缩文件提供了java.lang.IllegalStateException:zis.nextEntry不能为null。如何正确地做到这一点?

@Throws(IOException::class)
    fun unzip(zipFile: File, targetDirectory: File) {
        val zis = ZipInputStream(
                BufferedInputStream(FileInputStream(zipFile)))
        try {
            var ze: ZipEntry
            var count: Int
            val buffer = ByteArray(8192)
            ze = zis.nextEntry
            while (ze != null) {
                val file = File(targetDirectory, ze.name)
                val dir = if (ze.isDirectory) file else file.parentFile
                if (!dir.isDirectory && !dir.mkdirs())
                    throw FileNotFoundException("Failed to ensure directory: " + dir.absolutePath)
                if (ze.isDirectory)
                    continue
                val fout = FileOutputStream(file)
                try {
                    count = zis.read(buffer)
                    while (count != -1) {
                        fout.write(buffer, 0, count)
                        count = zis.read(buffer)
                    }
                } finally {
                    fout.close()
                    zis.closeEntry()
                    ze = zis.nextEntry
                }
            }
        } finally {
            zis.closeEntry()
            zis.close()
        }
    }

3 个答案:

答案 0 :(得分:7)

当您到达文件末尾时,您从流中读取的ZipEntry将为null,因此您必须将存储它的变量设置为可空:

var ze: ZipEntry?

您被允许将您读取的值分配给非可空变量,因为它们具有平台类型ZipEntry!,因为它是Java API - 在这种情况下您必须确定它是否可以null。有关详细信息,请参阅有关平台类型的docs

答案 1 :(得分:2)

您可以像ze一样定义变量var ze: ZipEntry。所以类型是ZipEntry而不是ZipEntry?(可空类型)。

如果您将var ze: ZipEntry更改为var ze: ZipEntry?,则该变量可以为空。

您可以查看Null Safety的文档。这是Kotlin最重要的事情之一。

答案 2 :(得分:0)

在尝试构建将我引向此处的功能时,我遇到了类似的问题。一旦我将zipEntry设置为可空,在if语句中会弹出一个错误,提示zipEntry?与zipEntry不匹配,我可以通过使用zipEntry解决它!保证它不为空。

      while(zippedFile != null) {
            fileName = zippedFile.name //It wasn't able to smart cast once zipEntry was nullable
            if (zippedFile.isDirectory) {} //Here it had a type mismatch

这是我能够解决的解决方案。

  while(zippedFile != null) {
            fileName = zippedFile!!.name //Adding !! (not null) allowed it to safely smart cast
            if (zippedFile!!.isDirectory) {} //Here adding not null removed the type mismatch

如果在Kotlin工作的任何人遇到此问题,希望对您有所帮助!