错误“不能为null”在Kotlin中

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

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

 var ze: ZipEntry? 

您可以将您读取的值分配给不可为空的变量,因为他们的平台类型为ZipEntry! ,因为它是一个Java API – 在这种情况下,你必须确定它是否可以为null 。 有关更多信息,请参阅有关平台类型的文档 。

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

如果你通过var ze: ZipEntry?更改var ze: ZipEntry var ze: ZipEntry? ,变量可以为null。

您可以检查文档的空安全性 。 这是Kotlin的大事之一。