Error "must not be null" in Kotlin

Petras Bartusis picture Petras Bartusis · Oct 10, 2017 · Viewed 22.1k times · Source

There are multiple files in a .zip file, which I'm trying to get. Trying to unzip the files provides a java.lang.IllegalStateException: zis.nextEntry must not be null. How to do it the right way?

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

Answer

zsmb13 picture zsmb13 · Oct 10, 2017

The ZipEntry you read from the stream will be null when you reach the end of the file, so you have to make the variable that you store it in nullable:

var ze: ZipEntry?

You were allowed to assign the values you read to a non-nullable variable because they had the platform type ZipEntry!, since it's a Java API - in this case you have to determine whether it can be null. See the docs about platform types for more information.