wake-up-neo.com

Fehler "darf nicht null sein" in Kotlin

Es gibt mehrere Dateien in einer ZIP-Datei, die ich versuche zu bekommen. Beim Versuch, die Dateien zu entpacken, wird eine Java.lang.IllegalStateException bereitgestellt: zis.nextEntry darf nicht null sein. Wie mache ich es richtig?

@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

Die ZipEntry, die Sie aus dem Stream lesen, wird null sein, wenn Sie das Ende der Datei erreichen. Daher müssen Sie die Variable, die Sie speichern, in nullfähig machen:

var ze: ZipEntry?

Sie durften die gelesenen Werte einer nicht-nullfähigen Variablen zuweisen, da sie den Plattformtyp ZipEntry! hatte, da es sich um eine Java-API handelt. In diesem Fall müssen Sie feststellen, ob es sich um null handeln kann. Weitere Informationen finden Sie in den Plattformtypen docs about.

7
zsmb13

Die Variable ze definieren Sie wie folgt var ze: ZipEntry. Der Typ ist also ZipEntry und nicht ZipEntry? (nullfähiger Typ).

Wenn Sie var ze: ZipEntry durch var ze: ZipEntry? ändern, kann die Variable null sein.

Sie können das Dokument auf Null Safety überprüfen. Bei Kotlin ist das eine der großen Sachen.

2
Kevin Robatel

Ich hatte ein ähnliches Problem, als ich versuchte, diese Funktionalität aufzubauen, die mich hierherführt. Sobald ich zipEntry nullable gemacht habe, tauchte ein Fehler in einer if-Anweisung auf, in der zipEntry stand. ist ein Missverhältnis zu zipEntry, das konnte ich mit zipEntry lösen !! garantieren, dass es nicht null war. 

      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

Dies war die Lösung, die ich herausfinden konnte. 

  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

Wenn jemand, der in Kotlin arbeitet, auf dieses Problem stößt, hoffe ich, dass es helfen kann! 

0
HamBeast