web-dev-qa-db-fra.com

Erreur dans Kotlin

Il y a plusieurs fichiers dans un fichier .Zip, que j'essaie d'obtenir. Essayer de décompresser les fichiers fournit une exception Java.lang.IllegalStateException: zis.nextEntry ne doit pas être null. Comment le faire de la bonne façon?

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

La ZipEntry que vous avez lue dans le flux sera null lorsque vous atteindrez la fin du fichier. Vous devez donc rendre la variable que vous stockez en nullable:

var ze: ZipEntry?

Vous avez été autorisé à affecter les valeurs que vous avez lues à une variable non nullable car elles avaient le type de plate-forme ZipEntry!, puisqu'il s'agit d'une API Java. Dans ce cas, vous devez déterminer si elle peut être null. Voir les docs sur les types de plateformes pour plus d’informations.

7
zsmb13

Vous définissez la variable ze comme ceci var ze: ZipEntry. Donc, le type est ZipEntry et pas ZipEntry? (type nullable).

Si vous modifiez var ze: ZipEntry par var ze: ZipEntry?, la variable peut être null.

Vous pouvez consulter le doc pour Null Safety . C'est l'un des gros truc avec Kotlin.

2
Kevin Robatel

J'ai eu un problème similaire en essayant de construire cette fonctionnalité qui m'a conduit ici. Une fois que j'ai rendu zipEntry nullable une erreur est apparue dans une instruction if qui disait zipEntry? est une incompatibilité pour zipEntry, j'ai pu résoudre ce problème en utilisant zipEntry !! en garantissant que ce n'était pas nul. 

      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

C’est la solution que j’ai pu trouver. 

  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

Si quelqu'un qui travaille à Kotlin rencontre ce problème, j'espère que cela pourra aider! 

0
HamBeast