Kotlin 中的错误“不得为 null”

.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()
        }
    }

答案 1

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

var ze: ZipEntry?

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


答案 2

您可以像这样定义变量。因此,类型是而不是(可为 null 的类型)。zevar ze: ZipEntryZipEntryZipEntry?

如果更改为 ,则变量可以为 null。var ze: ZipEntryvar ze: ZipEntry?

您可以查看文档以了解空安全性。这是 Kotlin 的一件大事。


推荐